我正在搜索双用数组(如果有的话!)
例如
obj[1] = "Tea";
obj[2] = "Coffee";
obj[3] = "Cola";
应该可以访问数组,无论数组中每个字符串的长度是多少,结果都应该被视为
obj(5)(1) = "TeaCo"
obj(5)(2) = "ffeeC"
obj(5)(2) = "ola"
我知道我们可以编写一个循环遍历数组并打印出结果的代码,但是有没有可以直接执行此操作的数据结构?
答案 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"
。等等。
无论您使用何种语言,您都可以轻松地为自己编写一个函数,从字符串中提取一系列字符。这就是你所需要的一切。