查看: 6581| 回复: 11
跳转到指定楼层
上一主题 下一主题
收起左侧

[找工就业] 求问一道关于auto complete的题目

全局:

2018(7-9月)-CS硕士+短暂实习或全职不超过3个月 | 内推| 码农类General全职@salesforce

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
求问一道关于 quip onsite autocompele的题目 链接如下
http://www.1point3acres.com/bbs/ ... &highlight=quip
和
http://www.1point3acres.com/bbs/thread-385460-1-1.html.1point3acres
这道题如果不用 trie 该怎么做呢? trie确实很占内存 刚刚试了一下自己的程序200mb的单词文档用了2g的内存, 看面筋好像面试官一直希望用除了trie能节省memory的方法做。
搜到一个compressed trie
http://theoryofprogramming.com/2016/11/15/compressed-trie-tree/


上一篇:请问最近面过Google的大佬们关于先team match再进HC的情况
下一篇:脸家的sponsor怎么给
全局:
我在地里之前回答一个人的onsite的时候那人没怎么搭理我, 就很恼火, 然后上网搜了一下打个头的具体做法. . 1point 3acres

但是之前水太多帖子了, 感觉找不到回答了. 我按印象说的了..
. ----
autocomplete 等价于 typeahead, 基本上就是说给你一个prefix string, return top k matching string.

我印象中这个题有三种做法.

第一个是大家都会想到的, trie, 然后在每个节点上存储满足当前prefix string 的 top k 个. 好处是容易搜索,  坏处是占用空间大. 因为每个节点都需要int[26], 以及一个top k, 而且大多数并不是需要的.
. Χ
第二个方法是把所有的word 按字典排序, 然后按给定的prefix 二分搜索开始以及结尾, 然后对着这中间的所有字符做 nlgk 排序. 这个方法是preprocess nlgn, 2遍 lgn, 和一遍 nlgk. 坏处是需要对所有的字符排序, 而且要maintain这个排序.
. ----
第三个方法是第一个方法的升级, 做的是ternary tree. 好像是个三分树. 其实我不熟, 没用过. 左岔是比当前root小, 右岔是比当前root大, 中岔是一样. 好像这样, 从来没有遇见过. 这个方法不会造26个结点, 好处坏处我完全不懂, 不敢评论了..1point3acres
..
其实autocomplete的博士论文还挺多的, 你多搜搜把..
回复

使用道具 举报

推荐
magicsets 2018-8-25 12:41:35 | 只看该作者
全局:
Trie或者Compressed Trie其实都是玩具.. Quip这个问题可能取材于真实的应用场景,具体问题具体分析,不要用应试思维去套用某一种算法或者数据结构 —— 因为最后能work的代码很可能是若干种方案的变形以及组合。

链接的帖子里提到了Elastic Search,那么就是类似于全文检索(full text search)的功能,一般使用倒排索引(inverted index)。并且倒排索引自身也有多种设计方案,所谓no single algorithm wins,要根据workload特性来选择。而根据链接的帖子里的描述,需要支持多个词匹配prefix,其实非常符合倒排索引的使用特性。

不过楼主提到自己使用的输入是200MB的单词文档,也就是说每个单词自成一行?这个似乎与链接帖子里提到的并不是同一种使用场景。

评分

参与人数 1大米 +5 收起 理由
everin + 5 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
szyyn95 2018-8-25 06:12:20 | 只看该作者
全局:
LC上有这个玩意吧,Search Autocomplete,我待会儿看看discussion页面有没有别的解法
回复

使用道具 举报

🔗
 楼主| killeralan 2018-8-25 07:19:54 | 只看该作者
全局:
szyyn95 发表于 2018-8-25 06:12
LC上有这个玩意吧,Search Autocomplete,我待会儿看看discussion页面有没有别的解法

看了一下 好像都是用trie 但是quip这道题好像面试官都要求不用trie的样子
回复

使用道具 举报

🔗
PepePls 2018-8-25 09:39:26 | 只看该作者
全局:
killeralan 发表于 2018-8-25 07:19
看了一下 好像都是用trie 但是quip这道题好像面试官都要求不用trie的样子
.--
我面过, 就是trie
回复

使用道具 举报

🔗
 楼主| killeralan 2018-8-25 10:30:34 | 只看该作者
全局:

诶 难道面试官没有很不情愿的 然后让你分析memory啥的。。
回复

使用道具 举报

🔗
 楼主| killeralan 2018-8-25 10:36:03 | 只看该作者
全局:
肥宅快乐水 发表于 2018-8-25 09:56. From 1point 3acres bbs
我在地里之前回答一个人的onsite的时候那人没怎么搭理我, 就很恼火, 然后上网搜了一下打个头的具体做法.
...

第二个方法啥叫搜索开始和结尾 我理解的是直接搜到了 prefix的位置然后往后查?
回复

使用道具 举报

全局:
killeralan 发表于 2018-8-25 10:36
第二个方法啥叫搜索开始和结尾 我理解的是直接搜到了 prefix的位置然后往后查?

举个例子好了, 你里面有

string = [aaa, aab, abc, acc, acd, ace, aee]
freq = [1,2,5,7,5,3,2]

那么你现在搜以ac开头的prefix string, 按二分搜索会搜到acc的位置, 也可以搜到ace的位置, 都是lgn操作.
看lc34.

然后假如你现在要top2, 那就是用一个普通的priority queue.

回复

使用道具 举报

全局:
killeralan 发表于 2018-8-25 10:36
第二个方法啥叫搜索开始和结尾 我理解的是直接搜到了 prefix的位置然后往后查?

被审核了, 类似lc34.. 1point 3acres

你string是按字典排序, 所以知道prefix 的第一个和最后一个的位置.

.google  и补充内容 (2018-8-25 11:39):.--
string = [aaa, aab, aac, abb, abc, acc, acd, ace, aee]
freq = [#,#,#..]-baidu 1point3acres
可以搜索到以acc开头的起始位置和最后一位, 然后做top k, 用priority queue即可
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表