用C管理100个项目的有效方法,开销很小

用C管理100个项目的有效方法,开销很小,c,optimization,data-structures,binary-tree,C,Optimization,Data Structures,Binary Tree,我在一个系统上,我的应用程序只有大约512kb的可用空间(其余部分用于缓冲区)。我需要尽可能有效率 我有大约100个项目可以从列表中快速添加/删除。在C中存储这些文件的有效方法是什么?是否有一个库(具有良好的许可证)可以提供帮助?该列表从不超过256项,其平均大小为15项 我应该使用二进制搜索树吗 红黑树 15项,如果您可以对其进行排序,则BST应该可以,但如果项非常小,则不确定开销是否比链表或数组好得多。对于许多插入/删除操作,我建议使用链接列表,因为您唯一需要做的就是补丁指针。我会使用双链

我在一个系统上,我的应用程序只有大约512kb的可用空间(其余部分用于缓冲区)。我需要尽可能有效率

我有大约100个项目可以从列表中快速添加/删除。在C中存储这些文件的有效方法是什么?是否有一个库(具有良好的许可证)可以提供帮助?该列表从不超过256项,其平均大小为15项

  • 我应该使用二进制搜索树吗
  • 红黑树

15项,如果您可以对其进行排序,则BST应该可以,但如果项非常小,则不确定开销是否比链表或数组好得多。对于许多插入/删除操作,我建议使用链接列表,因为您唯一需要做的就是补丁指针。

我会使用双链接列表。在处理数十个或数百个项目时,搜索速度并不比数组慢得多,而且它的优势是只占用绝对需要的空间。添加和删除元素非常简单,只需要很少的额外开销


树结构的搜索速度更快,但在添加或删除元素时会有更大的开销。也就是说,当处理数十个或数百个项目时,差异可能并不显著。如果我是你,我会为每个元素构建一个实现,看看哪一个在实际使用中更快。

如果列表不再是256,最好的选择是保存一个哈希表,并使用哈希函数添加/删除每个新元素。这样,每次添加/删除只需要O(1),所用内存的大小不需要太大。

平均大小为15,所有其他解决方案都是多余的;这里最好使用简单的动态数组。搜索是对数组的线性传递,插入和删除需要将所有元素移到插入点后面。但这一变化仍将被如此少的元素所缺乏的开销所抵消


更妙的是,由于您仍在进行线性搜索,因此可以通过将最后一个元素交换到已删除的位置来执行任意点的删除,这样就不需要进一步移动元素,从而产生O(1)用于插入和删除,O(非常小的n)用于查找。

普通的旧数组有什么问题?您说过“列表”,所以顺序可能很重要,所以您不能使用散列集(如果您使用散列集,请使用探测,而不是链接)


您不能使用链表,因为它会使您的内存需求翻倍。树也会有同样的问题,而且实现起来会困难得多。

你说一个包含100项的列表,然后最多提到256项。你是说有(不超过)100个不同的项,但每个项可能会出现多次吗?至于效率,你想最小化内存使用还是CPU时间?你能告诉我们你将如何使用这个列表吗?您需要任意索引访问吗?您需要从列表中间删除,还是只需要端到端删除?删除之后是否总是要添加?等等。听起来你不想要的是任何直接或间接以任何频率进行malloc/free的东西。如果项目的最大数量是256,而平均数量是15,那么只需创建一个大小为256的数组,并将项目保留在其中。吻动态内存分配适用于不确定最大存储需求的情况。我需要随机访问,特别是快速随机插入和删除。为了避免有人指出“O(非常小的n)”没有意义,这是一个笑话。为什么链表会使内存需求增加一倍?如果OP存储的是结构,那么与存储的数据相比,拥有指针的开销可能非常小。此外,数组会导致浪费空间(例如,分配一个256元素的数组,但仅使用它存储15个元素)。@quanticle:列表使用指针。32位arch上的双链接列表每项额外8字节。对于那个数量的项目,保持简单^3。我也会选择一个哈希表。