c++ - c/c++ 中的 url 缩短算法 - 面试

标签 c++ c algorithm

引用 - https://stackoverflow.com/a/742047/161243

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

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 写入磁盘吗?

附言哈希表+写入磁盘是数据库,但如果我不能使用 DBMS 怎么办?如果我需要提出自己的实现方案怎么办?

你的想法...

另一个问题:

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

最佳答案

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

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

关于c++ - c/c++ 中的 url 缩短算法 - 面试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9997637/

相关文章:

c++ - 创建全局键盘钩子(Hook)

c++ - 使用 malloc : why did it happen? 的内存分配导致堆损坏

algorithm - 根据过去发生的事件估计概率的简单算法?

c - 在C中如何防止UDP数据包被重复或丢弃?

python - 使用 .grid 将 tkinter 列表框的大小调整为最大项目的宽度

algorithm - 查找使用指定范围的数字计算数字所需的最少操作数

c++ - 如何 thrust::make_transform_iterator 取消引用 device_ptr?

c++ - 范围与 ctags 在功能方面

将多个 char* 复制到一个 char* 变量 C 语言

c - 检查 "Linking with external libraries"示例时出现矛盾的结果