我想按顺序记住最后n个唯一的数字。
这就是我的意思:假设n = 4。
我当前的列表为5 3 4 2
如果我添加6,则会变为3 4 2 6
。如果我添加3,则列表变为5 4 2 3
,其中3移到前面。
我会这样做:将数字存储在队列中。添加新号码时,在队列中搜索该号码。如果找不到该号码,请在末尾弹出号码,然后在前面按下新号码。如果找到该号码,请删除该位置的号码,然后在前面按下新号码。
现在显然,从队列中的任意位置删除一个数字,针对队列操作进行优化(如C ++中的std::deque
)将非常慢。使用链接列表,但搜索列表的速度会较慢。是否有更好的算法+数据结构组合来完成这类任务?
如果它有所不同,我不一定关心“按顺序记住最后n个唯一数字”。我特别需要知道,在添加(如果有)时,列表中已删除了哪些元素。
答案 0 :(得分:4)
您可以使用双向链表。您可以在哈希表中添加要记住的n个数字,其中键是数字本身,值是指向包含该数字的链表的节点的指针。
然后在您描述在队列中搜索数字的步骤中,您将其更改为查看数字是否在哈希表中,这将是常量时间而不是使用队列的班轮时间。
如果存储指向双向链表的第一个元素的指针p和指向列表最后一个元素的指针q,则可以在恒定时间内执行所描述的弹出和推送操作。
您的步骤如果找到该号码,则删除该位置的号码可以在固定时间内执行,因为您已经拥有要删除的号码的位置。(按位置我的意思是指针你从哈希表得到。)
更新:
请注意,您必须更新哈希表以相应地删除和添加新号码。