哪裏可以減小矩陣的大小? (x2數組) 例如,我只需要將數據(0,1,2)存儲到數組 中,但元素可以高達250 000。 有沒有一種方法來存儲值,如在字典..?關聯矩陣C++太大
const int MAX = 250000;
short data[MAX][MAX] = {};//wont compile..
哪裏可以減小矩陣的大小? (x2數組) 例如,我只需要將數據(0,1,2)存儲到數組 中,但元素可以高達250 000。 有沒有一種方法來存儲值,如在字典..?關聯矩陣C++太大
const int MAX = 250000;
short data[MAX][MAX] = {};//wont compile..
我記得靜態變量的sizeof有一些限制。使用動態內存。 根據元素數量和內存限制,您可以使用不同類型的存儲。
這完美的工作對我來說,因爲我上面的評論(live here):
#include <iostream>
#include <unordered_map>
std::unordered_map<unsigned int, std::unordered_map<unsigned int, unsigned char>> data;
int main() {
std::cout << "oi" << std::endl;
data[232432][234234] = 2;
data[2][2] = 1;
std::cout << int(data[232432][234234]) << std::endl;
std::cout << int(data[3][3]) << std::endl;
std::cout << int(data[232432][1]) << std::endl;
std::cout << int(data[2][2]) << std::endl;
}
完美!但爲了保持兼容性不僅僅適用於C++ 11? :) – Daniel
如果數據非常稀疏,然後Massa's approach具有每每個項目的額外unordered_map
的開銷。較低的開銷的解決辦法是指數無序地圖對:
#include <iostream>
#include <unordered_map>
/// Hash specialization for a pair of unsigned ints
template<> struct std::hash<std::pair<unsigned int, unsigned int>>
{
typedef std::pair<unsigned int, unsigned int> argument_type;
typedef std::size_t value_type;
value_type operator()(argument_type const& s) const
{
value_type const h1 (std::hash<unsigned int>()(s.first));
value_type const h2 (std::hash<unsigned int>()(s.second));
return h1^(h2 << 1);
}
};
std::unordered_map<std::pair<unsigned int, unsigned int>, unsigned char> data;
int main() {
using std::make_pair;
data[make_pair(232432u, 234234u)] = 2;
data[make_pair(2u, 3u)] = 1;
std::cout << int(data[make_pair(232432u, 234234u)]) << std::endl;
std::cout << int(data[make_pair(3u, 3u)]) << std::endl;
std::cout << int(data[make_pair(232432u, 1u)]) << std::endl;
std::cout << int(data[make_pair(2u, 3u)]) << std::endl;
}
這很好,但不僅對C++ 11兼容?那麼搜索價值呢? – Daniel
壓縮
您可以壓縮的數據值,這將節省你的內存,但增加的訪問時間。
您的取值範圍:0,1,2,佔用2位來表示。因此,一個8位,uint8_t,變量可以容納4列值:
3 2 1 0
+--+--+--+--+
|xx|xx|xx|xx|
+--+--+--+--+
要訪問該值,則需要執行一些二進制算術:
value of column 0 == (byte & 0x03); /* >> 0 */
value of column 1 == (byte & 0x0c) >> 2;
value of column 2 == (byte & 0x30) >> 4;
value of column 3 == (byte & 0xC0) >> 6;
字節將被訪問:(index/4)
變化的角度
因爲你只有3個值,你可以在座標存儲在一個數組列表。你會搜索數組的座標。
Data row col row col
+---+ +-----+----+ +-----+---+
| 0 | --> | 115 | 25 | --> |20961| 4 |
+---+ +-----+----+ +-----+---+
| 1 |
+---+
| 2 |
+---+
在上面的例子中,矩陣位置[115] [25]包含零以及[4]。
在上述技術中,您可以使用範圍壓縮矩陣位置。
這是個好主意,但是搜索呢?獲取鍵鍵索引的價值需要更長的時間嗎? – Daniel
你將不得不分析它。大多數搜索和排序算法的效率在一定程度上取決於數據。 –
'的std :: unordered_map>'將是我最初的想法。 –
WhozCraig
*我只需將數據(0,1,2)存儲到數組中,但元素可以高達250 000 *這是非常不清楚的。矩陣的維度是什麼?什麼是值的{最小值,最大值}範圍?每行/列有多少個非零元素? – japreiss
值可以是隻有0,1,2 但鍵可以高達250 000,例如數據[249043] [245235] = 0 – Daniel