[英]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.