Algorithm 在排名(排序)列表上执行前缀搜索的有效方法?
我有一个按概率排序的一些元素的大列表:Algorithm 在排名(排序)列表上执行前缀搜索的有效方法?,algorithm,sorting,kotlin,data-structures,Algorithm,Sorting,Kotlin,Data Structures,我有一个按概率排序的一些元素的大列表: data class Element(val value: String, val probability: Float) val sortedElements = listOf( Element("dddcccdd", 0.7f), Element("aaaabb", 0.2f), Element("bbddee", 0.1f) ) 现在,我需要在此列表上执行前缀搜索,以查找以一个前缀开始,然后以下一个前缀开始的项目,等等,元
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") }
通过某些前缀过滤的元素的每个请求都需要时间,如果列表很大,则速度太慢
如果我不关心元素的顺序及其概率,我可以按字典顺序对元素进行排序并执行二进制搜索:排序需要*logn时间和每个请求-Ologn时间
有没有办法在不损失元素排序概率的情况下加速这些操作的执行?也许有某种特殊的数据结构适合此任务 您可以阅读有关Trie数据结构的更多信息 这对于您的用例可能非常有用 Leetcode还有一个非常详细的解释,你可以在这里找到
希望这对您有所帮助如果您的列表不经常更改,您可以创建一个HashMap,其中每个现有前缀都是一个键,引用一个集合,该集合按其作为前缀的所有条目的概率排序 获取给定前缀的所有条目需要~O1
小心,地图太大了。创建映射需要相当长的时间。是的,我可以尝试加快前缀搜索,但在构建Trie时如何保持排序概率?可以同时从两个数据结构引用元素。为什么不使用两个列表?