【问题标题】:What is the most efficient way to keep track of a specific character's index in a string?跟踪字符串中特定字符索引的最有效方法是什么?
【发布时间】:2008-08-30 16:45:44
【问题描述】:

以下面的字符串为例:

“敏捷的棕狐”

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

“敏捷的深棕色狐狸”

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

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

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

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

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

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

【问题讨论】:

    标签: algorithm string optimization


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2012-05-03
            • 2016-02-06
            • 1970-01-01
            • 2016-07-28
            • 2020-01-19
            • 1970-01-01
            • 1970-01-01
            • 2021-11-16
            • 2010-11-21
            相关资源
            最近更新 更多