我一直在努力寻找满足这些要求的合适数据结构:
考虑到这一点,我有以下注意事项:
开发与我需要的顺序匹配的哈希函数可能很棘手,因为输入键可以是部分随机的。
我正在考虑的一种可能的解决方案(在C语言中)是保留一个指向保持插入顺序(或我需要的顺序)的元素的指针数组,然后再创建一个使用哈希对元素进行排序的第二个指针数组功能。第一个数组可用于快速访问元素并查找邻居,而第二个数组可用于快速搜索元素。但是不知何故,我觉得事情太复杂了,我不想重新发明轮子。
您怎么看?任何建议都将不胜感激。
非常感谢
答案 0 :(得分:2)
在这种情况下,数组可能是最好的数据结构。
插入数组涉及为新元素搜索正确的插槽,然后使用memmove
将所有较大的元素移到右侧。如果插入很频繁,那么这可能会很昂贵,但是如果不像您所说的那样频繁插入,那应该不会有问题。然后,您可以通过索引O(1)
进行检索并进行O(log n)
搜索。
维护指向实际数据的指针数组是一个好举动,因为这意味着您在插入新元素时只复制指针而不是完整的数据结构。
因此,您有一个数组,其中包含仅附加到其上的数据,以及一个指针数组,每个插入都使用该数组(即找到正确的位置并移位)。
答案 1 :(得分:0)
搜索树呢?除4外,它非常适合您的所有需求。
要满足此要求,您可以为每个节点维护一个额外的计数器。该计数器将记录该节点下方子树中的节点数。
添加计数器将允许在执行搜索操作时找到目标节点的索引(有关示例,请参见here)。这将使插入操作变得更加复杂,因为在插入节点之后,您还需要更新所有祖先树中的计数器,但是由于您说不会插入太多,因此这不成问题。>
答案 2 :(得分:0)
可能是“链式哈希表”,其中哈希表中的每个索引都是一个双向链接列表。在您的示例中,我想每个“块”都将由这样的双向链接列表表示。
这可以快速搜索块,但是搜索块内单个元素的速度相对较慢。块内的项目数很重要。但是,您将立即获得下一个/上一个项目,并且从那里遍历列表也将很快。链接列表也可以实现为数组,与单个节点的堆分配相比,它对数据高速缓存内存更友好。
或者,您可能使用类似的哈希表,但对每个索引使用二进制搜索树。您将快速搜索,并且可以很好地扩展大量数据。检索下一个/上一个项目的速度将如此缓慢,因为您必须检查左/右叶子是否存在,否则请检查父节点。