【发布时间】: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,请在问题中添加关于您需要在哪里插入/查询字符的说明