【发布时间】: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