C 连续可变序表

C 连续可变序表,c,arrays,sorting,data-structures,binary-search-tree,C,Arrays,Sorting,Data Structures,Binary Search Tree,这可能存在,也可能不存在,但我正在寻找一种存储整数排序列表的方法,该列表在内存中是连续的、合理紧凑的,并且允许O(logn)分期插入和删除。各种自平衡二叉搜索树似乎具有我想要的插入和删除属性,但它们都是用指针实现的,这不太适合我的用例。有什么想法吗 (如果重要的话,实现语言几乎肯定是C。如果你提出的任何东西都有现有的实现,那就更好了,但我可以自己编写。)A可以使用。根据“读比写多”这一事实,你可以尝试在其上使用+来实现。因此,您将获得对元素的O(logn)时间访问权(read),但您必须为插入/

这可能存在,也可能不存在,但我正在寻找一种存储整数排序列表的方法,该列表在内存中是连续的、合理紧凑的,并且允许O(logn)分期插入和删除。各种自平衡二叉搜索树似乎具有我想要的插入和删除属性,但它们都是用指针实现的,这不太适合我的用例。有什么想法吗


(如果重要的话,实现语言几乎肯定是C。如果你提出的任何东西都有现有的实现,那就更好了,但我可以自己编写。)

A可以使用。

根据“读比写多”这一事实,你可以尝试在其上使用+来实现。因此,您将获得对元素的
O(logn)
时间访问权(read),但您必须为插入/删除支付
O(n)
O(logn)
-在数组中搜索适当的位置+
O(n)
-将元素向右或向左移动)。这有点慢,但这是解决问题的方法。试想一下。

这是真的,但我还没有找到一种方法来为一个为O(logn)的阵列BST实现BST平衡操作,这意味着我要么忍受它的不平衡(这意味着它不会紧凑或性能),要么牺牲O(logn)插入和删除。数组的问题是,您必须调整整个数组的大小,以添加与
malloc
相同的新元素,并使用指向元素的新指针。这也意味着您将分配比需要更多的内存,这样您就不会经常不必要地调整它的大小。(例如,每次装满时,它的大小都会翻倍)那么,您需要它的确切原因是什么?您是否已经知道初始化时需要的确切大小?抱歉,直到刚才才看到您的评论。这些列表定期被压缩并刷新到磁盘,然后被应用程序的其他部分读取。读取比写入发生得更多,读取它们的任务需要能够真正快速地进行反序列化,因此只需将文件的内容解压缩到ram中并按原样使用即可。一组单独的任务会改变列表,在改变时,从一开始就知道要添加或删除的整数的数量,因此可以分配足够大的缓冲区来适应当前列表和新整数。嘿,你有解决方案吗?我想我在寻找类似的东西,如果没有弄错的话: