【发布时间】:2013-06-12 12:59:54
【问题描述】:
我正在使用 Emacs Lisp,但已加载 cl 包,用于一些常见的 lisp 功能。
我有一个包含多达 50K 条目的哈希表,整数键映射到三元组,类似这样(但实际上是 lisp):
{
8 => '(9 300 12)
27 => '(5 125 9)
100 => '(10 242 14)
}
三元组中的第二个值是在构建哈希表的复杂算法期间计算的分数。我需要收集一个常规的 lisp 列表,其中包含哈希中的所有键,按分数排序(即所有键按值的 cadr 排序)。
所以对于以上内容,我需要这个列表:
'(27 100 8)
我目前分两个阶段来做这件事,感觉效率比需要的要低。
有什么好办法吗?
我当前的解决方案使用maphash 将键和值收集到两个新列表中,然后以正常方式执行sort,引用谓词中的分数列表。然而,感觉就像我可以将集合和排序结合在一起。
编辑 |我也不喜欢使用哈希表,尽管我确实需要整数键的恒定访问时间,它们不是线性间隔的。
编辑 2|看起来实现二叉树排序可以工作,其中树中的标签是分数,值是键......这样我在映射哈希时进行排序。
...继续阅读关于排序算法的维基百科页面
【问题讨论】:
-
你是用 Elisp 还是 Common Lisp 编程?
-
我正在使用 elisp,但我确实加载了 cl(通用 lisp)包,以实现一些(非常)基本的通用 lisp 兼容性。
-
请注意
cl已弃用;它给人一种 CL 兼容性的错觉,但存在一些细微的错误和不兼容性。当心! -
EmacsWiki 有一个例子:emacswiki.org/emacs/ElispCookbook#toc45