C++ 联想矩阵c++;太大
减少矩阵大小的方法在哪里?(x2阵列) 例如,我只需要将数据(0、1、2)存储到数组中 但元素最多可以达到25万。? 有没有一种方法可以像在字典中那样存储值C++ 联想矩阵c++;太大,c++,arrays,matrix,2d,C++,Arrays,Matrix,2d,减少矩阵大小的方法在哪里?(x2阵列) 例如,我只需要将数据(0、1、2)存储到数组中 但元素最多可以达到25万。? 有没有一种方法可以像在字典中那样存储值 const int MAX = 250000; short data[MAX][MAX] = {};//wont compile.. 我记得静态变量的sizeof有一些限制。使用动态内存。 根据元素数量和内存限制,可以使用不同类型的存储 当元素数小于某个预定义值时,即数据密度较低时,可以使用稀疏矩阵。 稀疏矩阵的思想很简单:不保留所有可能
const int MAX = 250000;
short data[MAX][MAX] = {};//wont compile..
我记得静态变量的sizeof有一些限制。使用动态内存。 根据元素数量和内存限制,可以使用不同类型的存储
我记得静态变量的sizeof有一些限制。使用动态内存。 根据元素数量和内存限制,可以使用不同类型的存储
这对我来说非常有效,正如我在上面所评论的():
#包括
#包括
std::无序的地图数据;
int main(){
std::cout这对我来说非常有效,正如我在上面所评论的():
#包括
#包括
std::无序的地图数据;
int main(){
std::cout如果数据非常稀疏,则每个项目都有额外的无序映射的开销。较低的开销解决方案是使用成对索引无序映射:
#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;
}
#包括
#包括
///一对无符号整数的哈希专门化
模板结构std::hash
{
typedef std::pair参数类型;
typedef std::size\u t value\u type;
值类型运算符()(参数类型常量&s)常量
{
值_type const h1(std::hash()(s.first));
值_type const h2(std::hash()(s.second));
返回h1^(h2如果数据非常稀疏,则每个项都有额外的无序映射的开销。较低的开销解决方案是使用成对索引无序映射:
#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;
}
#包括
#包括
///一对无符号整数的哈希专门化
模板结构std::hash
{
typedef std::pair参数类型;
typedef std::size\u t value\u type;
值类型运算符()(参数类型常量&s)常量
{
值_type const h1(std::hash()(s.first));
值_type const h2(std::hash()(s.second));
返回h1^(h2压缩
您可以压缩数据值,这将节省内存,但会增加访问时间
您的值范围: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;
字节将通过以下方式访问:(索引/4)
视角的改变
因为您只有3个值,所以可以将坐标存储在数组的列表中。您可以在数组中搜索坐标
Data row col row col
+---+ +-----+----+ +-----+---+
| 0 | --> | 115 | 25 | --> |20961| 4 |
+---+ +-----+----+ +-----+---+
| 1 |
+---+
| 2 |
+---+
在上图中,矩阵位置[115][25]包含零,以及[20961][4]
在上述技术中,您可以使用范围压缩矩阵位置。压缩
您可以压缩数据值,这将节省内存,但会增加访问时间
您的值范围: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;
字节将通过以下方式访问:(索引/4)
视角的改变
因为您只有3个值,所以可以将坐标存储在数组的列表中。您可以在数组中搜索坐标
Data row col row col
+---+ +-----+----+ +-----+---+
| 0 | --> | 115 | 25 | --> |20961| 4 |
+---+ +-----+----+ +-----+---+
| 1 |
+---+
| 2 |
+---+
在上图中,矩阵位置[115][25]包含零,以及[20961][4]
在上述技术中,您可以使用范围来压缩矩阵位置。std::unordered_map
将是我最初的想法。我只需将数据(0、1、2)存储到数组中,但元素最多可以达到250000。这是非常不清楚的。矩阵的维度是什么?什么是{min,max}值的范围?每行/每列有多少个非零元素?值只能是0、1、2,但键最多可以是250000,例如data[249043][245235]=0您询问字典……这是否意味着data[i][j]
没有为许多i
s和j
定义