字符串的数据结构允许有效地提取块?

时间:2014-06-07 19:35:13

标签: arrays string data-structures

我正在搜索双用数组(如果有的话!)

例如

obj[1] = "Tea";
obj[2] = "Coffee";
obj[3] = "Cola";

应该可以访问数组,无论数组中每个字符串的长度是多少,结果都应该被视为

obj(5)(1) = "TeaCo" 
obj(5)(2) = "ffeeC" 
obj(5)(2) = "ola"

我知道我们可以编写一个循环遍历数组并打印出结果的代码,但是有没有可以直接执行此操作的数据结构?

2 个答案:

答案 0 :(得分:0)

您的查询似乎有

形式
  

如果输入被分成大小为k的块,那么rth块会是什么?

让我们将这种查询称为块查询(k,r)。

您可以通过使用扩充平衡二叉树在时间O(k + log n)中支持这些查询,其中n是不同字符串的数量。使用其左右子树中的字符总数以及其左右子树中的字符串数量(换句话说,使订单统计树的变体)注释树中的每个节点。另外,通过节点线程化双向链表,以便在时间O(1)中从任何节点导航到其后继节点。

要在索引i处插入或更新值,请搜索与位置i对应的节点,并在其前面插入新值或更新其内容。

要执行块查询(k,r),请使用扩充搜索索引为kr的字符。这将花费时间O(log n)。然后,直到读取了k个字符,继续从当前节点读取字符,必要时通过跟踪链接列表遍历到下一个节点。这将花费时间O(k)总计,如果节点中的平均字符数较低,可能会少得多。

希望这有帮助!

答案 1 :(得分:0)

“是否有可以直接执行此操作的数据结构?”

是。它是一个字符数组,也称为字符串。

如果你的字符串是"TeaCoffeeCola",那么(在Java中),string.substring(0,5)"TeaCo"string.substring(5,5)"ffeeC"。等等。

无论您使用何种语言,您都可以轻松地为自己编写一个函数,从字符串中提取一系列字符。这就是你所需要的一切。