用于随机插入和随机查询的高效算法

时间:2017-10-31 07:27:48

标签: algorithm data-structures

我需要在性能限制下实现以下两个操作,

  /** insert a character, c at a given position, pos **/
    void insert(char c, int pos);

  /** return the current character at given position, pos **/
    char query(int pos);

这两个函数都可以被调用10 ^ 8次:(。在任何位置插入新值将改变/增加其右部分元素的所有位置。

起初,我正在考虑使用Array来实现,但在最坏的情况下insert()会花费很多,因为每当我在某处插入新值时我需要移动数组的右侧部分数组的开头。

然后我想用Linked List来实现,但这与query()函数的成本相同,因为要获得实际值,我必须向前/向后移动链表。

我想知道是否有任何众所周知的算法或数据结构可以在这种情况下有所帮助。

更新#1:

之前发布了类似问题(Data structure: insert, remove, contains, get random element, all at O(1)),

但是哈希对于这个问题是不可行的,因为当值为char类型时频繁发生冲突。在10 ^ 8个位置只能有26个字符。此外,我不需要在O(1)中解决,因为这个问题在O(1)中的性质似乎无法解决。我想要一些交易或混合解决方案,其中最小的数组和链表将被最小化。

正如@DAIe在评论中提到的,我需要一些像操作一样的字符串。而且,insert to positio n操作根本不是哈希表操作。

1 个答案:

答案 0 :(得分:4)

有一个rope data structure。它是一个平衡的二叉树,叶节点包含短字符串。

enter image description here

它有O(log(n))最坏情况查询操作和O(log(n))平均时间插入操作。