Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在排名(排序)列表上执行前缀搜索的有效方法?_Algorithm_Sorting_Kotlin_Data Structures - Fatal编程技术网

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时如何保持排序概率?可以同时从两个数据结构引用元素。为什么不使用两个列表?