【问题标题】:algorithm to partition strings by prefix按前缀划分字符串的算法
【发布时间】:2018-06-19 03:22:12
【问题描述】:

给定一个字符串列表 L(已排序)和一个正整数 N (N

示例:定义数据结构和函数如下:

type PrefixGroup struct {
    Prefix string 
    Count  int
}
func partition(L []string, N int, prefix string) []PrefixGroup

列表 L 在调用时可能包含数千个字符串

partition(L, 8, "")

输出可能是:

[
    {"Prefix":"13", "Count":1000},
    {"Prefix":"180": "Count": 10},
    {"Prefix":"X": "Count": 2},
    ... ...
]

这意味着在L中,有1000个字符串以“13”开头,10个以“180”开头,2个以“X”开头。请注意,前缀的长度是 not 固定的。该算法的关键要求是对具有公共前缀的字符串进行分区,使得组数尽可能接近但不超过N。

根据上面的结果,我可以调用partition(L, 8, "13") 来进一步挖掘以“13”开头的 L 子集:

[
    {"Prefix":"131", "Count": 50},
    {"Prefix":"135": "Count": 100},
    {"Prefix":"136": "Count": 500},
    ... ...
]

不是家庭作业问题。我需要为手头的项目编写这样的算法。我可以“蛮力”写它,只是想知道是否有任何经典/知名的数据结构和/或算法来实现经过验证的时间/空间效率。

我考虑过trie,但是不知道会不会消耗太多内存...

【问题讨论】:

  • 如果您可以指定您的空间/时间要求和数据规模,这将有所帮助。在 len(L)~1e3 的尺度上,不需要编写任何额外的代码。
  • 你的意思是第一句中“长度最多为N的公共前缀”吗?
  • @Petar Petrovic,“最多 N”表示最多 N 个 ,而不是前缀长度。
  • @leaf bebop 我会先尝试蛮力方法,然后对这里提供的答案进行一些研究。
  • @xrfang 所以“按长度为 N 的公共前缀分组”意味着每个前缀的长度必须为 N?那为什么会有“组数接近但不超过N”这个要求呢?如果前缀的长度是固定的,组数不应该也是固定的吗?

标签: string algorithm go prefix


【解决方案1】:

嗯,有一些算法,但前缀树是要走的路。

前缀树或 trie(通常发音为“try”)是一棵树,其节点不保存键,而是保存部分键。例如,如果您有一个存储字符串的前缀树,那么每个节点都是字符串中的一个字符。如果您有一个存储数组的前缀树,则每个节点都是该数组的一个元素。元素从根开始排序。因此,如果您有一个前缀树,其中包含单词“hello”,那么根节点将有一个子节点“h”,而“h”节点将有一个子节点“e”,而“e”节点将有一个子节点“l”等。一个键的最深节点上会有某种布尔标志,表明它是某个键的终端节点。 (这很重要,因为键的最后一个节点并不总是叶节点......考虑一个带有“dog”和“doggy”的前缀树)。前缀树非常适合查找具有特定前缀的键。

【讨论】:

    【解决方案2】:

    您需要使用Radix trie。 你可以阅读the difference between a trie and a Radix trie

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 2016-04-28
      • 2016-03-24
      • 2020-09-08
      • 2021-06-25
      相关资源
      最近更新 更多