我必须在ACL2中使用排序映射/索引结构。目前我有以下内容:
( (key1 . (val1 val2)) (key2 . (val3)) (key3 . (val4 val5 val6)) )
还有其他方法可以更有效地做到这一点吗?
答案 0 :(得分:0)
从你的例子来看,我并不清楚你要做什么。
您当然可以在关联列表上定义操作,使其按键排序顺序。在那种情况下:
get
函数看起来就像是acons put
函数需要查找"右键"放置元素的地方。但这并不是特别有效。两个操作都是O(n)。此外,作为一个实际考虑,put
操作将需要O(n)个,这是特别昂贵的,因为cons
分配内存。
通常最好只使用普通的关联列表,即使用acons
和assoc
。主要的优点是,因为它只是将新的键/值对汇集到列表的前面,acons
是O(1),所以构造映射通常要便宜得多。如果需要,您可以随时对alist的键进行排序,例如,使用set::mergesort或某些自定义排序功能。
访问alists仍然是O(n)。但是,fast-alists在ACL2(h)中可用,并且基本上提供了一种获取哈希表速度的方法。另请参阅std/alists的文档。