c / c ++中的url缩短算法 - 访谈

时间:2012-04-03 16:37:12

标签: c++ c algorithm

参考 - https://stackoverflow.com/a/742047/161243

以上algo说我们使用DB来存储数据。现在,如果面试官说你不能使用数据库。那么在这种情况下我们可以有一个结构:

struct st_short_url{
  char * short_url;
  char * url;
} 

然后是哈希表 - st_short_url* hashTable[N];

现在我们可以拥有一个int id,每次增加一个或随机数生成id,转换为base62。

问题我明白了:

- 如果此过程终止,那么我将失去int id的跟踪并从RAM完成hashTable。那么我是否继续将hashTable写回磁盘以使其保持不变?如果是,那么将使用B树?我们还需要将id写入磁盘吗?

P.S。 Hashtable +写入磁盘是数据库,但如果我不能使用DBMS怎么办?如果我需要提出自己的实现怎么办?

请你的想法......

另一个问题:

一般来说,我们如何处理URL缩短中的无限重定向?

3 个答案:

答案 0 :(得分:2)

如果您不能使用任何类型的数据库(即没有持久存储;文件系统只是原始数据库!),那么我所看到的唯一方法是使用允许的字符进行无损压缩+编码。压缩算法可以使用关于URLS的知识(例如,它很可能以http://https://开头,很多人继续使用www.并且域名最常结束在.com.org.net中。此外,您始终可以在主机名后面加上斜杠(因为http://example.orghttp://example.org/相同)。您也可以假设URL只包含有效字符,特殊情况下一些子串很可能出现在URL中(例如频繁链接的域,或某些站点的已知命名方案).Probaby压缩方案应该具有版本字段,以便您可以在使用模式发生变化时更新算法(例如,新网站变得流行,您想要特殊情况,或者流行网站更改其特殊情况下的网址格式),而不会冒旧链接无效的风险

也可以通过扩展直接在浏览器中支持这样的方案,从而节省服务器带宽(对于没有浏览器扩展的用户,服务器仍然必须在那里;如果扩展还没有最新的压缩,那么服务器仍然需要回退数据)。

答案 1 :(得分:2)

要求不切实际,但您无需给出实际答案。只需使用文件系统,他就不会意识到这一点。

存储:

  1. 将输入网址转换为字符串,例如base64转换。
  2. 制作该名称的文件
  3. 将inode编号作为短网址(例如ls -i filename)或stat()等返回。
  4. 要检索:

    1. 从用户处获取inode编号。
    2. 查找/ -inum n -print或其他一些机制。
    3. 将其转换回文件名中的网址。

答案 2 :(得分:1)

数据库是一种支持插入,删除和搜索项目的数据结构。正如对OP的评论所指出的那样,几乎所有东西都是数据库,因此这种约束似乎有点不了解。

如果您不允许使用现有的DBMS,您可以使用tmpnam()或类似的技术在磁盘上存储项目,而不会受到竞争条件的影响。 tmpnam()生成唯一ID,您可以使用关联文件来存储信息。