iki vektör uzayının kartezyen çarpımı
Aug 16 2020
Birkaç gün önce aşağıdakileri okuyan ilginç bir problem buldum:
İki vektör alanı verildiğinde, kartezyen ürününün sonuç kümesini oluşturur. \ begin {toplama} \ text {Let:} \ mathcal {V}, \ mathcal {W} \ text {vektör uzayları} \\ \ mathcal {V} \ times \ mathcal {W} = \ {(v, w ) \ orta v \ in \ mathcal {V} \ land w \ in \ mathcal {W} \} \ end {topla}
- İpucu 1: Vektör uzayı, bazı özellikleri gerçekleştiren, vektör adı verilen bir dizi unsurdur.
- İpucu 2: Sonlu vektör uzayları için çözüm tasarlayın
- İpucu 1: Yapıların kullanılması tavsiye edilir
- Kısıtlama: Herhangi bir stl sınıfını kullanmanız yasaktır
Bu sorunu bir sonraki yaklaşımla çözdüm:
struct vector_pair
{
double *vector_a;
double *vector_b;
size_t a_dimension;
size_t b_dimension;
};
struct cartesian_product_set
{
vector_pair *pairs;
size_t pairs_number;
};
cartesian_product_set vector_spaces_cartesian_product(double **space_v, size_t v_vectors,
size_t v_dimension, double **space_w, size_t w_vectors, size_t w_dimension)
{
cartesian_product_set product_set{new vector_pair[v_vectors * w_vectors], v_vectors * w_vectors};
for (size_t i = 0, j, k = 0; i < v_vectors; i++)
for (j = 0; j < w_vectors; j++)
product_set.pairs[k++] = vector_pair{space_v[i], space_w[j], v_dimension, w_dimension};
return product_set;
}
Mümkünse bu kodu nasıl geliştirebilirim?
Teşekkür ederim.
Yanıtlar
2 cauon Aug 18 2020 at 15:28
- sabit doğruluk
- Mümkünse işaretçiler lehine referanslar kullanın
- Arayana ayırdığınız hafızayı boşaltma yükümlülüğünü bırakmanız, genellikle iyi bir uygulama değildir.
- Kodunuzdaki ortak bir model dizilere ve uzunluklarına işaretçilerinizin olmasıdır - neden onları bir araya getirecek bir yapı oluşturmuyorsunuz?
- Dizine gerçekten ihtiyacınız olmadığında (örneğinizde yok) yineleyicilerden ve döngü için aralık tabanlılardan yararlanmaya çalışın
- Bir vektör uzayındaki öğelerin türünü gerçekten önemsemediğimizden, algoritmanızı genelleştirmek için şablonlar kullanabilirsiniz.
Ve bunun mümkün olup olmadığını görmek için, algoritmanın derleme zamanı versiyonunu bulmaya çalıştım:
template<typename T>
struct pair
{
T first;
T second;
};
template<std::size_t N, typename T>
struct cvp
{
pair<T> pairs[N];
};
template <typename T, size_t NV, size_t NW>
auto get_cvp(const T (&vs)[NV], const T (&ws)[NW])
{
cvp<NV*NW, T> result;
auto it_pairs = std::begin(result.pairs);
for (const auto v : vs) {
for (const auto w : ws) {
*(it_pairs++) = {v, w};
}
}
return result;
}
kodu buradan deneyebilirsiniz: https://godbolt.org/z/e8GvEf
Donovan, Şarkılarından 1'ini The Beatles'ın "Lucy in the Sky with Diamonds" şarkısıyla karşılaştırdı
Nicole Kidman, Michael Keaton ve Val Kilmer'in Batman Olarak Paylaştığı Bu 1 Çekici Özelliğe Bayıldı
Kevin Jonas'ın Kızı Alena, Doğum Günü Fotoğrafında Büyümüş Görünüyor: '9 Yaşında Gerçek Hissetmiyor'
Tom Girardi Dolandırıcılık Suçlamalarından Yargılanma Yetkisinin Belirlenmesi İçin Duruşmaya Katıldı