【发布时间】:2019-08-13 14:45:56
【问题描述】:
我有一个按概率排序的一些元素的大列表:
data class Element(val value: String, val probability: Float)
val sortedElements = listOf(
Element("dddcccdd", 0.7f),
Element("aaaabb", 0.2f),
Element("bbddee", 0.1f)
)
现在我需要对该列表执行前缀搜索,以查找以一个前缀开头然后以下一个前缀开头的项目,依此类推(元素仍然需要按概率排序)
val filteredElements1 = sortedElements
.filter { it.value.startsWith("aa") }
val filteredElements2 = sortedElements
.filter { it.value.startsWith("bb") }
每个由某个前缀过滤的元素的“请求”都需要 O(n) 时间,这在列表很大的情况下太慢了。
如果我不关心元素的顺序(它们的概率),我可以按字典顺序对元素进行排序并执行二进制搜索:排序需要 O(n*log n) 时间,每个请求 - O(log n) 时间。
有没有什么方法可以加快这些操作的执行,同时又不会丢失元素的排序(概率)?也许有某种特殊的数据结构适合这个任务?
【问题讨论】:
-
为什么不是两个列表?
标签: algorithm sorting kotlin data-structures