Algorithm 迭代所有最短长度字符串的算法?

Algorithm 迭代所有最短长度字符串的算法?,algorithm,data-structures,Algorithm,Data Structures,我正在做一个URL缩短器,我想为每个给定的URL使用尽可能短的字符串。每个URL将有不同的到期日期 例如,让我们将缩短的URL提交到以下列表: a,b,c,…,z,0,…,9,aa,ab,ac。。。a9,ba 然后,假设c过期,那么下一个URL应该缩短为c,而不是bb,因为c较短并且不被占用 什么样的数据结构有助于跟踪此情况?这是一个有趣的问题。为此,您需要几个数据结构。这就是我要做的 1) 一个哈希表,短URL作为键,所有URL信息(完整URL、过期时间等)作为值 2) 过期URL的最小堆。这

我正在做一个URL缩短器,我想为每个给定的URL使用尽可能短的字符串。每个URL将有不同的到期日期

例如,让我们将缩短的URL提交到以下列表:

a,b,c,…,z,0,…,9,aa,ab,ac。。。a9,ba

然后,假设
c
过期,那么下一个URL应该缩短为
c
,而不是
bb
,因为
c
较短并且不被占用


什么样的数据结构有助于跟踪此情况?

这是一个有趣的问题。为此,您需要几个数据结构。这就是我要做的

1) 一个哈希表,短URL作为键,所有URL信息(完整URL、过期时间等)作为值

2) 过期URL的最小堆。这将允许您快速获取并重用可用的最短URL

3) 一个字符串,用于跟踪正在使用的最长短URL。如果没有较短的过期URL,则可以快速生成新URL


4) 可以跟踪过期时间的东西,这样您就可以有效地使URL过期。它可以是日期-->短URL形式的哈希表,带有有序键,因此您可以轻松获取下一个过期的URL。

我将使用优先级队列,其比较器具有嵌套规则,第一个是空或Take上的标志,第二个是字符串上的标志。请记住,PQ会将您最想要的对象放在队列的顶部。因此,您的对象应该是字符串名称和布尔标志的组合。

我将使用两个堆

  • 未使用url的最小堆,其中最小值为url
  • 已用URL的最小堆,其中最小值是自1970年1月1日以来的秒数(长值)
    当您需要一个新的url时,从堆的顶部拉1。当url过期时,从堆2中取出url并将其插入堆1。

    虽然PQ不能用于任何数量的条目,但必须有一个限制。据我所知,这是不可能的。除非通过编程将PQ设置为某个限制,否则PQ是无效的。事实上,有一种简单的方法可以解决这个问题。另一个问题是,如果添加了大量元素,那么它们将永远在PQ中,占用大量空间。我想我可以定期清除它们。同样,这取决于应用程序。如果保留一个跟踪过期URL的简单计数器,则PQ只能增长到某个极限。一旦过期URL的数量超过限制,我们可以删除/轮询对象。