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
  1. sabit doğruluk
  2. Mümkünse işaretçiler lehine referanslar kullanın
  3. Arayana ayırdığınız hafızayı boşaltma yükümlülüğünü bırakmanız, genellikle iyi bir uygulama değildir.
  4. Kodunuzdaki ortak bir model dizilere ve uzunluklarına işaretçilerinizin olmasıdır - neden onları bir araya getirecek bir yapı oluşturmuyorsunuz?
  5. Dizine gerçekten ihtiyacınız olmadığında (örneğinizde yok) yineleyicilerden ve döngü için aralık tabanlılardan yararlanmaya çalışın
  6. 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