【问题标题】:Efficient algorithm for random insertion and random query随机插入和随机查询的高效算法
【发布时间】:2017-10-31 07:27:48
【问题描述】:

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

  /** 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 position 操作根本不是哈希表操作。

【问题讨论】:

  • @thebenman 问题不同。当值是 char 类型时,哈希是不可能的。此外,我不需要 O(1) 解决方案。
  • 你当然可以使用 char 数据类型的哈希数据结构。此外,如果你调用它 10^8 次,O(1) 可以带来显着的改进。
  • @thebenman, insert to position 操作根本不是哈希表操作
  • @SazzadHissainKhan,请在问题中添加关于您需要在哪里插入/查询字符的说明

标签: algorithm data-structures


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-12
    • 2012-02-16
    • 2021-01-09
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 2011-11-01
    相关资源
    最近更新 更多