跟踪字符串中特定字符索引的最有效方法是什么?

时间:2008-08-30 16:45:45

标签: algorithm string optimization

以下面的字符串为例:

“快速的棕色狐狸”

现在快速的q在字符串的索引4处(从0开始)并且fox中的f在索引16处。现在假设用户在该字符串中输入更多文本。

“非常快的深褐色狐狸”

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

无论用户添加了多少个字符,最快速跟踪f中原始q索引的最有效方法是什么?

语言对我来说无关紧要,这不仅仅是一个理论问题,所以使用你想要的任何语言,只是试着将它保存到一般流行的语言中。

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

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

我希望答案是时间和内存效率,但如果我只选择一个,我更关心性能速度。

4 个答案:

答案 0 :(得分:2)

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

每当您在低于索引的位置将字符串插入字符串时,只需根据插入字符串的长度计算偏移量。

答案 1 :(得分:2)

假设您有一个字符串,其中一些字母有趣。为了让事情变得更容易,我们可以说索引0处的字母总是很有趣,而且你永远不会在它之前添加一些东西 - 一个哨兵。写下一对(有趣的字母,与之前有趣的字母的距离)。如果字符串是“+非常快速的深棕色狐狸”并且您对'快速'和f感兴趣来自'fox'那么你会写:(+,0),(q,10),(f,17) )。 (符号+是哨兵。)

现在将它们放在一个平衡的二叉树中,其按顺序遍历按照它们在字符串中出现的顺序给出字母序列。您现在可以识别partial sums problem:增强树,使节点包含(字母,距离,总和)。总和是左子树中所有距离的总和。 (因此sum(x)=距离(left(x))+ sum(left(x))。)

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

要说你在 c 字符的左边添加了 n 字符,你说距离(c)+ = n然后去和所有父母的更新总和< EM> C

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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