【发布时间】:2016-04-27 23:50:57
【问题描述】:
我正在制作一个 URL 缩短器,并且我想为每个给定的 URL 使用尽可能短的字符串。每个 URL 都有不同的到期日期。
例如,让我们提交缩短为以下列表的 URL:
a, b, c, ..., z, 0 ..., 9, aa, ab, ac, ... a9, ba
然后,假设 c 过期,因此下一个 URL 应缩短为 c 而不是 bb,因为 c 较短且未被占用。
什么数据结构有利于跟踪这个?
【问题讨论】:
我正在制作一个 URL 缩短器,并且我想为每个给定的 URL 使用尽可能短的字符串。每个 URL 都有不同的到期日期。
例如,让我们提交缩短为以下列表的 URL:
a, b, c, ..., z, 0 ..., 9, aa, ab, ac, ... a9, ba
然后,假设 c 过期,因此下一个 URL 应缩短为 c 而不是 bb,因为 c 较短且未被占用。
什么数据结构有利于跟踪这个?
【问题讨论】:
我会使用一个优先级队列,它的比较器有嵌套规则,第一个是空或被占用的标志,第二个是字符串。请记住,PQ 将您最需要的对象放在队列的顶部。因此,您的对象应该是字符串名称和布尔标志的组合。
【讨论】:
这是一个有趣的问题。为此,您需要几个数据结构。这就是我会做的。
1) 一个哈希表,以短 URL 作为键,所有 URL 信息(完整 URL、到期时间等)作为值。
2) 过期 URL 的最小堆。这将允许您快速抓取和重用可用的最短 URL。
3) 一个字符串,用于跟踪正在使用的最长短 URL。如果没有更短的过期 URL,这使您可以快速生成新 URL。
4) 跟踪过期时间的东西,这样您就可以有效地使 URL 过期。可以是 Date-->ShortURL 形式的哈希表,带有有序的键,这样你就可以很容易地得到下一个过期的 url。
【讨论】:
我会使用 2 个堆。
当你需要一个新的url时,从堆1的顶部拉取。当一个url过期时,从堆2拉取url并插入到堆1中。
【讨论】: