第一个问题是:“我如何用C做一个简单的稀疏数组(只有一个维度)?” {亲自动手,没有图书馆。}
最后一个:“我可以只分配数组的一部分吗?”
喜欢* array;
然后使用malloc为此分配一些mem; 所以,我们释放了我们不想要的索引。
我可以这样做吗?
非常感谢!
答案 0 :(得分:5)
不,你不能这样做。
您可以做的是分配块,但您需要仔细设计它。
可能最好的优化是使用细胞范围。因此,您可以使用可用范围的链接列表(或地图):
struct SparseBlock
{
void *blockData;
int beginIndex;
int endIndex;
struct SparseBlock *next;
}
显然如果endIndex - beginIndex = 0
你有一个单元格(在数组中被隔离),否则你有一个单元格块,允许你为它分配适量的内存。
这种方法对于不可变稀疏向量很简单,否则你应该处理
此外,您必须决定如何索引这些块,您可以将它们保存在链表中,或者您可以使用映射来获取恒定的O(1)时间来检索第n个块(当然如果它是一个范围,你必须为同一个块插入许多相等的键,或者将索引减少到最接近的最低索引。)
解决方案很多,只是表达你的创造力! :)
答案 1 :(得分:1)
在这种或那种链接结构中实现这些并不罕见。在一个维度中,您可以简单地生成已占用区域的链接列表,之前我在另一个上下文中讨论了a two dimensional implementation。
你确实以这种方式失去了O(1)访问时间,但如果结构真的很稀疏,空间上的胜利可能会很大。