tích của hai không gian vector

Aug 16 2020

Một vài ngày trước, tôi đã tìm thấy một vấn đề thú vị như sau:

Cho hai không gian vectơ tạo ra tập kết quả của tích các-ten của nó. \ begin {collect} \ text {Let:} \ mathcal {V}, \ mathcal {W} \ text {là không gian vectơ} \\ \ mathcal {V} \ times \ mathcal {W} = \ {(v, w ) \ mid v \ in \ mathcal {V} \ land w \ in \ mathcal {W} \} \ end {collect}

  • Gợi ý 1: Không gian vectơ là một tập hợp các phần tử được gọi là vectơ có một số thuộc tính
  • Gợi ý 2: Thiết kế lời giải cho không gian vectơ hữu hạn
  • Mẹo 1: Nên sử dụng các cấu trúc
  • Ràng buộc: Bạn bị cấm sử dụng bất kỳ lớp stl nào

Tôi đã giải quyết vấn đề này với cách tiếp cận tiếp theo:

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;
}

Làm cách nào để cải thiện mã này nếu có thể?

Cảm ơn bạn.

Trả lời

2 cauon Aug 18 2020 at 15:28
  1. hằng số
  2. sử dụng các tham chiếu có lợi cho con trỏ nếu có thể
  3. Thực tế là bạn bỏ nghĩa vụ giải phóng bộ nhớ mà bạn cấp cho người gọi nói chung không phải là một thực tiễn tốt
  4. một mẫu phổ biến trong mã của bạn là bạn có các con trỏ đến các mảng và độ dài của chúng - tại sao không tạo một cấu trúc để nhóm chúng lại?
  5. cố gắng sử dụng các trình vòng lặp và các vòng lặp dựa trên phạm vi khi bạn không thực sự cần chỉ mục (mà bạn không có trong ví dụ của mình)
  6. vì chúng tôi không thực sự quan tâm đến loại phần tử trong không gian vectơ, bạn có thể sử dụng các mẫu để khái quát thuật toán của mình

Và để xem liệu nó có khả thi không, tôi đã cố gắng đưa ra phiên bản thời gian biên dịch của thuật toán:

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;
}

bạn có thể thử mã ở đây: https://godbolt.org/z/e8GvEf