关于数据结构的建议

时间:2018-11-13 13:54:25

标签: c data-structures

我一直在努力寻找满足这些要求的合适数据结构:

  1. 此数据结构的元素按块组织。这些块的顺序有些无关紧要,但是块中的元素保持一定的顺序。
  2. 插入次数不频繁。
  3. 搜索要频繁得多。
  4. 检索数据结构中元素的索引至关重要。
  5. 一旦搜索到数据结构的元素,则应该可以轻松访问数据结构中的下一个或上一个(高度)元素。

考虑到这一点,我有以下注意事项:

  • 链表或双链表对于需求1、2、4和5可能是最佳的,但会强制进行线性搜索,从而损害了需求。 3。
  • 哈希表解决要求。 3,但据我所知在要求中存在问题。 5,因为在使用散列时,人们会失去对数据结构内元素位置的控制。

开发与我需要的顺序匹配的哈希函数可能很棘手,因为输入键可以是部分随机的。

我正在考虑的一种可能的解决方案(在C语言中)是保留一个指向保持插入顺序(或我需要的顺序)的元素的指针数组,然后再创建一个使用哈希对元素进行排序的第二个指针数组功能。第一个数组可用于快速访问元素并查找邻居,而第二个数组可用于快速搜索元素。但是不知何故,我觉得事情太复杂了,我不想重新发明轮子。

您怎么看?任何建议都将不胜感激。

非常感谢

3 个答案:

答案 0 :(得分:2)

在这种情况下,数组可能是最好的数据结构。

插入数组涉及为新元素搜索正确的插槽,然后使用memmove将所有较大的元素移到右侧。如果插入很频繁,那么这可能会很昂贵,但是如果不像您所说的那样频繁插入,那应该不会有问题。然后,您可以通过索引O(1)进行检索并进行O(log n)搜索。

维护指向实际数据的指针数组是一个好举动,因为这意味着您在插入新元素时只复制指针而不是完整的数据结构。

因此,您有一个数组,其中包含仅附加到其上的数据,以及一个指针数组,每个插入都使用该数组(即找到正确的位置并移位)。

答案 1 :(得分:0)

搜索树呢?除4外,它非常适合您的所有需求。

要满足此要求,您可以为每个节点维护一个额外的计数器。该计数器将记录该节点下方子树中的节点数。

添加计数器将允许在执行搜索操作时找到目标节点的索引(有关示例,请参见here)。这将使插入操作变得更加复杂,因为在插入节点之后,您还需要更新所有祖先树中的计数器,但是由于您说不会插入太多,因此这不成问题。

答案 2 :(得分:0)

可能是“链式哈希表”,其中哈希表中的每个索引都是一个双向链接列表。在您的示例中,我想每个“块”都将由这样的双向链接列表表示。

这可以快速搜索块,但是搜索块内单个元素的速度相对较慢。块内的项目数很重要。但是,您将立即获得下一个/上一个项目,并且从那里遍历列表也将很快。链接列表也可以实现为数组,与单个节点的堆分配相比,它对数据高速缓存内存更友好。

或者,您可能使用类似的哈希表,但对每个索引使用二进制搜索树。您将快速搜索,并且可以很好地扩展大量数据。检索下一个/上一个项目的速度将如此缓慢,因为您必须检查左/右叶子是否存在,否则请检查父节点。