2

以下面的字符串为例:

“敏捷的棕色狐狸”

现在 quick 中的 q 位于字符串的索引 4 处(从 0 开始),而 fox 中的 f 位于索引 16 处。现在假设用户在该字符串中输入了更多文本。

“速度极快的深褐色狐狸”

现在 q 在索引 9 处, f 在索引 26 处。

无论用户添加多少个字符,在 quick 和 fox 中跟踪原始 q 的索引的最有效方法是什么?

语言对我来说无关紧要,这更像是一个理论问题,所以使用任何你想要的语言,尽量让它保持普遍流行和当前的语言。

我给出的示例字符串很短,但我希望有一种方法可以有效地处理任何大小的字符串。因此,使用偏移量更新数组将适用于短字符串,但会因许多字符而陷入困境。

即使在示例中我正在寻找字符串中唯一字符的索引,我也希望能够在不同位置跟踪相同字符的索引,例如棕色的 o 和狐狸的 o。所以搜索是不可能的。

我希望答案既节省时间又节省内存,但如果我必须选择一个,我更关心性能速度。

4

4 回答 4

2

您的问题有点模棱两可 - 您是否希望跟踪每个字母的第一个实例?如果是这样,长度为 26 的数组可能是最佳选择。

每当您将文本插入到低于您所拥有索引的位置的字符串中时,只需根据插入字符串的长度计算偏移量。

于 2008-08-30T16:51:04.573 回答
2

假设您有一个字符串,其中的一些字母很有趣。为方便起见,我们假设索引 0 处的字母总是很有趣,并且您永远不会在它之前添加任何东西——哨兵。写下成对的(有趣的字母,与前一个有趣字母的距离)。如果字符串是“+the very Quick dark brown Fox”并且你对 'quick' 中的 q 和 'fox' 中的 f 感兴趣,那么你会写: (+,0), (q,10), (f,17 )。(符号 + 是标记。)

现在你把它们放在一个平衡的二叉树中,它的中序遍历按照它们在字符串中出现的顺序给出了字母序列。您现在可能认识到部分和问题:您增强了树,使节点包含(字母、距离、总和)。总和是左子树中所有距离的总和。(因此总和(x)=距离(左(x))+总和(左(x))。)

您现在可以以对数时间查询和更新此数据结构。

要说你在字符c的左边添加了n 个字符,你说 distance(c)+=n 然后去更新c的所有父母的总和。

要问c的索引是多少,你计算 sum(c)+sum(parent(c))+sum(parent(parent(c)))+...

于 2008-10-07T09:22:39.627 回答
1

如果您有目标语言,这也会有所帮助,因为并非所有数据结构和交互在所有语言中都同样高效和有效。

于 2008-08-30T17:25:14.910 回答
0

在类似情况下通常有帮助的标准技巧是将字符串的字符保持为平衡二叉树中的叶子。此外,树的内部节点应保留以特定节点为根的子树中出现的字母集(如果字母表很小且固定,它们可能是位图)。

在这个结构中插入或删除一个字母只需要 O(log(N)) 操作(更新根路径上的位图)并且找到第一个出现的字母也需要 O(log(N)) 操作 - 你从根,寻找位图包含有趣字母的最左边的孩子。

编辑:内部节点还应该在表示的子树中保留叶子的数量,以便有效计算字母的索引。

于 2008-10-07T09:49:10.600 回答