前几天我出去买杂货,需要在钱包里搜索我的信用卡、客户奖励(忠诚)卡和带照片的身份证。我的钱包里还有几十张其他卡(工作证、其他信用卡等),所以我花了一段时间才找到所有东西。
我的钱包里有六个可以放卡片的插槽,每个插槽中的第一张卡最初都是可见的。如果我想找到一张特定的卡,我必须记住它在哪个插槽中,然后一次查看该插槽中的所有卡以找到它。越靠近插槽的前面,就越容易找到它。
我突然想到这几乎是一个数据结构问题。假设你有一个由 k 个链表组成的数据结构,每个链表可以存储任意数量的元素。您希望以最小化查找的方式将元素分配到链接列表中。您可以使用任何您想要的系统将元素分配到不同的列表中,并且可以随时重新排序列表。鉴于此设置,在任何假设下,是否存在对列表进行排序的最佳方法:
- 预先给定了访问每个元素的概率,并且访问是独立的,或者
- 您事先不知道什么时候会访问哪些元素?
我在钱包中使用的非正式系统是根据用例(ID、信用卡、会员卡等)将卡“散列”到不同的插槽中,然后将每个插槽中的元素按访问频率粗略排序。但是,也许有更好的方法来做到这一点(例如,将 k 最常用的元素存储在每个插槽的前面,而不管它们的用例如何)。
是否有解决此问题的已知系统?这是数据结构中众所周知的问题吗?如果是这样,最佳解决方案是什么?
(如果这似乎与编程无关:我可以想象一个应用程序,其中用户有几个常用项目的下拉列表,并希望以最小化查找所需时间的方式保持这些项目的顺序一个特定的项目。)