簡體   English   中英

如何將 3d 維度不是固定大小的 3D 數組展平為一維數組?

[英]How to flatten a 3D array where the 3d dimension is not fixed size into 1D array?

給定一個二維數組,其中每個 (x,y) 單元包含一個不同大小的字符串向量(為簡單起見)。

將此數據結構展平為一維數組的最有效方法是什么,即創建一個 function 將每個字符串單射映射到 {1,...,n},其中 n 是數據結構中的字符串總數。

您可以在 O(1) 中將 map 索引i, j, k轉換為線性 position p並返回 O(log N),其中N是二維數組的大小,而不是字符串的總數。

首先,讓我們將您的 2D 數組視為 1D,因為這會使事情變得更容易。 索引i是數組中向量的索引。 索引k是向量中字符串的 position。 N是數組的大小。

您可以創建一個整數數組(例如size_t ),其中包含所有向量長度的從零開始的累積和:

lengths = array[N]
lengths[0] = 0
for(i = 1 to N)
    lengths[i] = lengths[i - 1] + size(array[i - 1])

如果需要,可以將字符串總數計算為total = lengths[N - 1] + size(array[N - 1])

現在,對於索引i, k處的給定字符串,擴展數組中的 position 只是

p = lengths[i] + k

給定一個 position p ,你 map 它到i, k使用二分算法(二進制搜索,當找不到完全匹配時返回左邊界的索引):

i = bisect(lengths, p)
k = p - lengths[i]

二分法是一種簡化的二分搜索,所以 O(log N)。

在您開始擴展向量之前,所有這些都非常有效。 此時,插入和刪除操作變成 O(N) 操作,因為您需要增加或減少插入點之后的所有累積和。 插入:

array[i][k].push(a_string)
for(z = i + 1 to N)
    lengths[z]++

並刪除:

array[i][k].pop()
for(z = i + 1 to N)
    lengths[z]--

順便說一句,如果您仍想對數組使用索引x, y ,您可以在lengths的線性索引i之間轉換並使用

i = x + C * y
x = i % C
y = i / C

在這里, C是數組中的列數。 您可以輕松地將其推廣到任意數量的維度。

簡單直接的方式不適合你嗎?

#include <vector>
#include <string>

int main() {
        std::vector<std::string> omg[3][4];
        std::vector<std::string> rv;
        for(auto const &row: omg) {
                for(auto const &cell: row) {
                        for(auto const &str: cell) {
                                rv.push_back(str);
                        }
                }
        }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM