当前位置: 首页 > 知识库问答 >
问题:

按频率降序列出以固定前缀开头的“k”字

江礼骞
2023-03-14

我有一个大约10^5英语单词及其初始频率的列表。我想写一个单词完成建议程序,它将返回一个最大k单词列表,从给定前缀开始,按频率降序排序。数据结构还应该能够将一个单词的频率计数更新1(无论何时使用一个单词)。

例如,给定'engin'作为前缀,并且k=3,它应该返回这样的列表-{17,“engine”}、{10,“engineer”}、{4,“engineering”}

k的值应在[1,15]范围内。

Trie如果按频率排序不是一个问题,那么数据结构应该足够了,但它确实是一个问题。有人能给我一些数据结构或解决这个问题的方法吗?

注意:Trie数据结构占用太多空间。似乎我负担不起这个数据结构超过10MB的开销。另外,如果我使用与trie节点相关的最大堆(至少高达3/4深度),内存消耗将变得巨大。

现在我已经试过了——维护4个排序集(指针,指向字符串)。Seti是指向字符串长度的字符串的指针列表

  • 字符串的首字母i的字典顺序
  • 如果发生冲突,则按频率降序排列
  • 如果再次发生冲突,以任何顺序(无关紧要)

考虑到我需要O(4nlog2(n))时间和O(nlog2(n))空间进行初始化,这工作得很好。对于每个查询,我的查找时间复杂度为O(log2(n)),再加上最坏情况下最多大约100个单词的遍历。为了更新一个单词的频率,需要O(8*log2(n))时间。


共有2个答案

宰父子安
2023-03-14

为什么不是trie呢?您可以为计数器使用额外的数据栏并将排序算法添加到搜索算法中。更新计数器和trie也很快。如果您只想要k个最大值/顶部边缘,那么它会更快,因为您不需要对所有边缘进行排序。

贡可人
2023-03-14

这可以通过组合两种数据结构来完成:trie和段树。(如果字典是静态的并且k不是很大)。

为字典构造trie后,使用属于该节点的第一个/最后一个单词的索引来扩充每个trie节点。例如,节点“engin”可以存储“engine”的索引1001和“engineering”的索引1003。

在搜索k单词列表时,首先在trie中搜索给定的前缀。然后使用第一个/最后一个单词索引执行k范围最大查询。每次查询后,将找到的单词的频率计数临时设置为-1

使用段树数据结构进行范围最大查询。(有关详细信息,请参阅TopCoder上的教程)。

这种方法允许在时间O(前缀大小k*log(dict大小))内处理每个查询。计数器更新需要O(日志(dict_size))时间。初始频率以O(dict_size)时间加载。

另一种选择是在trie的每个节点中存储一个排序数组,数组中包含k_max{counter,index}对。

初始频率应在O(k_max*dict_size)时间内以自下而上的顺序(使用DFS)在每个节点上进行合并更新。每个计数器更新需要O(k_max*word_length)时间。Top-k查询在O(prefix_size)时间内提供。缺点是内存要求更高。

 类似资料:
  • 问题内容: Python中有什么方法可以按频率对列表进行排序? 例如, 上面的列表将按照其值的频率顺序进行排序,以创建以下列表,其中频率最高的项目位于最前面: 问题答案: 我认为这对于A来说将是一项好工作: 或者,您可以写第二行而不使用lambda: 如果您有多个具有相同频率的元素 并且 您希望这些元素保持分组状态,那么我们可以通过更改排序键以不仅包括计数,还包括 值 来做到这一点:

  • 本文向大家介绍程序以Python找出等效频率的序列,包括了程序以Python找出等效频率的序列的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个数字列表。我们必须找到最长的数字序列的长度,这样当我们从序列中删除一个数字时,每个数字都会出现相同的次数。 因此,如果输入像数字= [2、4、4、7、7、6、6],那么输出将为7。 为了解决这个问题,我们将遵循以下步骤- num_freq:=新映射

  • 问题内容: 我将要有一个固定的项目清单,直到有一个随机化步骤,我才能运行查询直到执行该查询为止。 我想要以下内容: 假设is_launch_set将返回1,3,7,11,但已被随机分配到以下位置: 关于如何实现这一目标的任何想法?我在想也许是一个find_in_set,但不是很确定。 问题答案: 您可以使用以下任一方法来做到这一点: 要么 要么

  • 我有一个azure容器,其中包含按日期命名的目录(例如20201203包含2020年12月23日创建的所有文件)。目录中的文件是这样命名的: {filename}{format}{extension} 对于目录20201203的例子,我有这3个文件: < li>file1_300_300.png < li>file1_150_150.png < li>file2_300_300.png 我想获得特

  • 问题内容: 我正在尝试编写一个函数,该函数将测试列表是否按降序排列。到目前为止,这是我所拥有的,但似乎不适用于所有列表。 我使用了列表,它返回了。 我似乎无法弄清楚我的错误在哪里。 问题答案: 您宁可进行反向检查(一旦获得,则返回false

  • 问题内容: 如何在如下所示的SQLAlchemy查询中使用ORDER BY ? 此查询有效,但以升序返回: 如果我尝试: 然后我得到:。 问题答案: 来自@ jpmc26的用法