Redian新闻
>
有些Show Line GSD是如何运动的 (转载)
avatar
有些Show Line GSD是如何运动的 (转载)# pets - 心有所宠
f*n
1
一道RF的面试题:
有N个ad, (n是million级别的)
每个ad的表示为(id, value)
比如:
121 -> new
130 -> new york
145 -> new york time square
156 -> new york department store
假设有一 query = new york department store
规定ad中每个单词都包含在query中时,这个ad为valid (即ad是query的子集)
上述例子中ad 121, 130, 156是valid的,145是invalid
问:
如何设计一个solution,使得
vector getValid(string query) (返回所有valid的ad的id)这个函
数在worst case时复杂度也能小于O(n),面试官的说法是does not depend on N.
整个solution可以分两个阶段,第一阶段是preprocessing,这个可以是O(n)的,但是
第二阶段query阶段,也即调用函数getValid(),必须小于O(n)
我给是方案是在preprocessing阶段建立类似trie的结构,就是把trie中每个字母换成
单词,每增加一个单词,向下走一层。建树时就顺便mark每个node是否valid。query时
只要检查所有leaf node,如果valid就向上检查parent,直到invalid为止。这样
average的复杂度应该是O(logN)。但是面试官说worst case,就是每个ad都是valid时
,我的方案的复杂度还是O(N)。
大家有什么想法吗?
avatar
b*i
2
如果没有几个人成功,我就直接call and cancel,省的自取其辱。
哈哈
avatar
l*8
3
【 以下文字转载自 GSD 俱乐部 】
发信人: laosong8 (吃喝玩乐坐汽车), 信区: GSD
标 题: Show Line GSD是如何运动的
发信站: BBS 未名空间站 (Sat Apr 7 00:16:37 2012, 美东)
avatar
f*n
4
up
avatar
d*0
5
直接发message cancel了

【在 b********i 的大作中提到】
: 如果没有几个人成功,我就直接call and cancel,省的自取其辱。
: 哈哈

avatar
p*y
6
OMG,这个审美还真是变态
avatar
x*w
7

preprocessing 就是建reverse indexing,
然后查 ”new york department store“的时候得查4次reverse indexing的集合,
每个集合遍历检查每个广告排除包含其他单词的广告, 然后union这4次的结果

【在 f*****n 的大作中提到】
: 一道RF的面试题:
: 有N个ad, (n是million级别的)
: 每个ad的表示为(id, value)
: 比如:
: 121 -> new
: 130 -> new york
: 145 -> new york time square
: 156 -> new york department store
: 假设有一 query = new york department store
: 规定ad中每个单词都包含在query中时,这个ad为valid (即ad是query的子集)

avatar
k*u
8
AA的休息厅一年用了4次,留着不合算,就打电话去关。
给我返还100块,然后每月花1500后多些点数,花到多少又给5000点什么的。
本来就没想留,所以也没听很清楚,就关了。
休息厅就用Ritz给的Lounge Club,哦也。
avatar
e*r
9
不知道是不是将来想让showline跟人一样直立行走。。。

【在 l******8 的大作中提到】
: 【 以下文字转载自 GSD 俱乐部 】
: 发信人: laosong8 (吃喝玩乐坐汽车), 信区: GSD
: 标 题: Show Line GSD是如何运动的
: 发信站: BBS 未名空间站 (Sat Apr 7 00:16:37 2012, 美东)

avatar
f*n
10
你这方法就是建一个map,key是单词,value是包含这个单词的广告,这是我提出的第
一种方案,被否了。

【在 x*********w 的大作中提到】
:
: preprocessing 就是建reverse indexing,
: 然后查 ”new york department store“的时候得查4次reverse indexing的集合,
: 每个集合遍历检查每个广告排除包含其他单词的广告, 然后union这4次的结果

avatar
o*r
11

$100 statement credit
5000 miles for 2 months/$1500 Purchase
直接cancel

【在 b********i 的大作中提到】
: 如果没有几个人成功,我就直接call and cancel,省的自取其辱。
: 哈哈

avatar
c*3
12
变态 。。。。。
avatar
x*w
13

不是符合要求吗,为啥被否呢?

【在 f*****n 的大作中提到】
: 你这方法就是建一个map,key是单词,value是包含这个单词的广告,这是我提出的第
: 一种方案,被否了。

avatar
b*i
14
Thanks
avatar
b*n
15
这题的要求preprocess是 O(n), 查找是O(2^k), 其中k为query的长度,假设query的
长度一般比较小,可以认为constant
对每个ad做hashing,每个query取所有子集的hashing查找,关键是怎么做hashing让不
同顺序但是所含单词相同的ad的hash值相同, 比如, h(new york time) = h(york
new time)
avatar
r*h
16
将一个query里面的单词按照lexicology order排序后再计算hash值

【在 b*****n 的大作中提到】
: 这题的要求preprocess是 O(n), 查找是O(2^k), 其中k为query的长度,假设query的
: 长度一般比较小,可以认为constant
: 对每个ad做hashing,每个query取所有子集的hashing查找,关键是怎么做hashing让不
: 同顺序但是所含单词相同的ad的hash值相同, 比如, h(new york time) = h(york
: new time)

avatar
u*g
17
这种算法如何判断145是invalid的。。

【在 x*********w 的大作中提到】
:
: 不是符合要求吗,为啥被否呢?

avatar
g*s
18
题目中的N和n是同样的意思吗?

【在 f*****n 的大作中提到】
: 一道RF的面试题:
: 有N个ad, (n是million级别的)
: 每个ad的表示为(id, value)
: 比如:
: 121 -> new
: 130 -> new york
: 145 -> new york time square
: 156 -> new york department store
: 假设有一 query = new york department store
: 规定ad中每个单词都包含在query中时,这个ad为valid (即ad是query的子集)

avatar
b*n
19
这个是我当时给的答案
不过面试官的意思是排序这步也可以省掉,有直接算hash的方法

【在 r**h 的大作中提到】
: 将一个query里面的单词按照lexicology order排序后再计算hash值
avatar
l*e
20
Is it related with 'Bag of words'? How about hash trick.
wiki: Bag of words, hash trick
avatar
x*w
21

在第一轮查new的时候就排除了啊

【在 u******g 的大作中提到】
: 这种算法如何判断145是invalid的。。
avatar
u*g
22
哦你说“每个集合遍历检查每个广告排除包含其他单词的广告”。。看起来会复杂度会
更高些。。

【在 x*********w 的大作中提到】
:
: 在第一轮查new的时候就排除了啊

avatar
Y*f
23
需要加个count? preprocess加上ad中单词的count, 对query的每个单词查询时,把
对应的ad加入hash table并记录被查询的次数,然后traverse hashtable,查询的次数
等于ad的count的ad就是。
这个和前面xiaoxiaowww的差不多,但是感觉应该会快些。

【在 f*****n 的大作中提到】
: 你这方法就是建一个map,key是单词,value是包含这个单词的广告,这是我提出的第
: 一种方案,被否了。

avatar
h*n
24
inverted index
IR里面的经典问题
avatar
r*h
25
请教一下,使用inverted index的话,求并集或者交集如何做到小于O(N)呢?
无论是sort之后有序查找还是使用bitmap,最坏情况下复杂度还是O(N)呀

【在 h*****n 的大作中提到】
: inverted index
: IR里面的经典问题

avatar
x*0
26
mark
avatar
e*n
27
mark
avatar
f*1
28
大家看这个行不行?
由2^k 得到启发
建一个大表 每行表示一个ad, 每列表示frequent query string 的一个词,表的值表
示单词是否出现在某一个ad里。
wordcount new... york ...department ...store ... sale.
ad1 5 1 1 1 1 1
ad2 1 0 1 0 0 1
ad3 4 1 1 1 1 0
...
adn 1 1 0 0 0 0
建表需要O(N)
查询需要先生成query string的所有subsets, 这一步需要2^k, 然后与(&)query
string match对应列vector,选与值为1的ads。最后再用第一列的word count 排除包
含多余query string 单词个数的ad即得到所求的ads。

【在 f*****n 的大作中提到】
: 一道RF的面试题:
: 有N个ad, (n是million级别的)
: 每个ad的表示为(id, value)
: 比如:
: 121 -> new
: 130 -> new york
: 145 -> new york time square
: 156 -> new york department store
: 假设有一 query = new york department store
: 规定ad中每个单词都包含在query中时,这个ad为valid (即ad是query的子集)

avatar
y*c
29
mark
avatar
c*p
30
mark
avatar
H*S
31
做一个reversed indexing先,然后建立另外一个哈希表,键是索引,值是所含*独特*
单词数量。查找时,先用reversed indexing求得所有索引,建立一个映射关系,索引
对应索引出现次数,如果这个次数低于其对应独特单词数量,即舍弃。

【在 f*****n 的大作中提到】
: 一道RF的面试题:
: 有N个ad, (n是million级别的)
: 每个ad的表示为(id, value)
: 比如:
: 121 -> new
: 130 -> new york
: 145 -> new york time square
: 156 -> new york department store
: 假设有一 query = new york department store
: 规定ad中每个单词都包含在query中时,这个ad为valid (即ad是query的子集)

avatar
v*n
32
mark nn【在 forecan (Harry)的大作中提到:】n:一道RF的面试题:n:有N个ad, (n
是million级别的)n:每个ad的表示为(id, value)n:比如:n:121 -> newn:130 -
> new yorkn:145 -> new york time squaren……nn--n[发自未名空间Android客户端
]
avatar
f*b
33
mark
avatar
m*i
34
mark

【在 f*****n 的大作中提到】
: 一道RF的面试题:
: 有N个ad, (n是million级别的)
: 每个ad的表示为(id, value)
: 比如:
: 121 -> new
: 130 -> new york
: 145 -> new york time square
: 156 -> new york department store
: 假设有一 query = new york department store
: 规定ad中每个单词都包含在query中时,这个ad为valid (即ad是query的子集)

avatar
f*n
35
一道RF的面试题:
有N个ad, (n是million级别的)
每个ad的表示为(id, value)
比如:
121 -> new
130 -> new york
145 -> new york time square
156 -> new york department store
假设有一 query = new york department store
规定ad中每个单词都包含在query中时,这个ad为valid (即ad是query的子集)
上述例子中ad 121, 130, 156是valid的,145是invalid
问:
如何设计一个solution,使得
vector getValid(string query) (返回所有valid的ad的id)这个函
数在worst case时复杂度也能小于O(n),面试官的说法是does not depend on N.
整个solution可以分两个阶段,第一阶段是preprocessing,这个可以是O(n)的,但是
第二阶段query阶段,也即调用函数getValid(),必须小于O(n)
我给是方案是在preprocessing阶段建立类似trie的结构,就是把trie中每个字母换成
单词,每增加一个单词,向下走一层。建树时就顺便mark每个node是否valid。query时
只要检查所有leaf node,如果valid就向上检查parent,直到invalid为止。这样
average的复杂度应该是O(logN)。但是面试官说worst case,就是每个ad都是valid时
,我的方案的复杂度还是O(N)。
大家有什么想法吗?
avatar
f*n
36
up
avatar
x*w
37

preprocessing 就是建reverse indexing,
然后查 ”new york department store“的时候得查4次reverse indexing的集合,
每个集合遍历检查每个广告排除包含其他单词的广告, 然后union这4次的结果

【在 f*****n 的大作中提到】
: 一道RF的面试题:
: 有N个ad, (n是million级别的)
: 每个ad的表示为(id, value)
: 比如:
: 121 -> new
: 130 -> new york
: 145 -> new york time square
: 156 -> new york department store
: 假设有一 query = new york department store
: 规定ad中每个单词都包含在query中时,这个ad为valid (即ad是query的子集)

avatar
f*n
38
你这方法就是建一个map,key是单词,value是包含这个单词的广告,这是我提出的第
一种方案,被否了。

【在 x*********w 的大作中提到】
:
: preprocessing 就是建reverse indexing,
: 然后查 ”new york department store“的时候得查4次reverse indexing的集合,
: 每个集合遍历检查每个广告排除包含其他单词的广告, 然后union这4次的结果

avatar
x*w
39

不是符合要求吗,为啥被否呢?

【在 f*****n 的大作中提到】
: 你这方法就是建一个map,key是单词,value是包含这个单词的广告,这是我提出的第
: 一种方案,被否了。

avatar
b*n
40
这题的要求preprocess是 O(n), 查找是O(2^k), 其中k为query的长度,假设query的
长度一般比较小,可以认为constant
对每个ad做hashing,每个query取所有子集的hashing查找,关键是怎么做hashing让不
同顺序但是所含单词相同的ad的hash值相同, 比如, h(new york time) = h(york
new time)
avatar
r*h
41
将一个query里面的单词按照lexicology order排序后再计算hash值

【在 b*****n 的大作中提到】
: 这题的要求preprocess是 O(n), 查找是O(2^k), 其中k为query的长度,假设query的
: 长度一般比较小,可以认为constant
: 对每个ad做hashing,每个query取所有子集的hashing查找,关键是怎么做hashing让不
: 同顺序但是所含单词相同的ad的hash值相同, 比如, h(new york time) = h(york
: new time)

avatar
u*g
42
这种算法如何判断145是invalid的。。

【在 x*********w 的大作中提到】
:
: 不是符合要求吗,为啥被否呢?

avatar
g*s
43
题目中的N和n是同样的意思吗?

【在 f*****n 的大作中提到】
: 一道RF的面试题:
: 有N个ad, (n是million级别的)
: 每个ad的表示为(id, value)
: 比如:
: 121 -> new
: 130 -> new york
: 145 -> new york time square
: 156 -> new york department store
: 假设有一 query = new york department store
: 规定ad中每个单词都包含在query中时,这个ad为valid (即ad是query的子集)

avatar
b*n
44
这个是我当时给的答案
不过面试官的意思是排序这步也可以省掉,有直接算hash的方法

【在 r**h 的大作中提到】
: 将一个query里面的单词按照lexicology order排序后再计算hash值
avatar
l*e
45
Is it related with 'Bag of words'? How about hash trick.
wiki: Bag of words, hash trick
avatar
x*w
46

在第一轮查new的时候就排除了啊

【在 u******g 的大作中提到】
: 这种算法如何判断145是invalid的。。
avatar
u*g
47
哦你说“每个集合遍历检查每个广告排除包含其他单词的广告”。。看起来会复杂度会
更高些。。

【在 x*********w 的大作中提到】
:
: 在第一轮查new的时候就排除了啊

avatar
Y*f
48
需要加个count? preprocess加上ad中单词的count, 对query的每个单词查询时,把
对应的ad加入hash table并记录被查询的次数,然后traverse hashtable,查询的次数
等于ad的count的ad就是。
这个和前面xiaoxiaowww的差不多,但是感觉应该会快些。

【在 f*****n 的大作中提到】
: 你这方法就是建一个map,key是单词,value是包含这个单词的广告,这是我提出的第
: 一种方案,被否了。

avatar
h*n
49
inverted index
IR里面的经典问题
avatar
r*h
50
请教一下,使用inverted index的话,求并集或者交集如何做到小于O(N)呢?
无论是sort之后有序查找还是使用bitmap,最坏情况下复杂度还是O(N)呀

【在 h*****n 的大作中提到】
: inverted index
: IR里面的经典问题

avatar
x*0
51
mark
avatar
e*n
52
mark
avatar
f*1
53
大家看这个行不行?
由2^k 得到启发
建一个大表 每行表示一个ad, 每列表示frequent query string 的一个词,表的值表
示单词是否出现在某一个ad里。
wordcount new... york ...department ...store ... sale.
ad1 5 1 1 1 1 1
ad2 1 0 1 0 0 1
ad3 4 1 1 1 1 0
...
adn 1 1 0 0 0 0
建表需要O(N)
查询需要先生成query string的所有subsets, 这一步需要2^k, 然后与(&)query
string match对应列vector,选与值为1的ads。最后再用第一列的word count 排除包
含多余query string 单词个数的ad即得到所求的ads。

【在 f*****n 的大作中提到】
: 一道RF的面试题:
: 有N个ad, (n是million级别的)
: 每个ad的表示为(id, value)
: 比如:
: 121 -> new
: 130 -> new york
: 145 -> new york time square
: 156 -> new york department store
: 假设有一 query = new york department store
: 规定ad中每个单词都包含在query中时,这个ad为valid (即ad是query的子集)

avatar
y*c
54
mark
avatar
c*p
55
mark
avatar
H*S
56
做一个reversed indexing先,然后建立另外一个哈希表,键是索引,值是所含*独特*
单词数量。查找时,先用reversed indexing求得所有索引,建立一个映射关系,索引
对应索引出现次数,如果这个次数低于其对应独特单词数量,即舍弃。

【在 f*****n 的大作中提到】
: 一道RF的面试题:
: 有N个ad, (n是million级别的)
: 每个ad的表示为(id, value)
: 比如:
: 121 -> new
: 130 -> new york
: 145 -> new york time square
: 156 -> new york department store
: 假设有一 query = new york department store
: 规定ad中每个单词都包含在query中时,这个ad为valid (即ad是query的子集)

avatar
v*n
57
mark nn【在 forecan (Harry)的大作中提到:】n:一道RF的面试题:n:有N个ad, (n
是million级别的)n:每个ad的表示为(id, value)n:比如:n:121 -> newn:130 -
> new yorkn:145 -> new york time squaren……nn--n[发自未名空间Android客户端
]
avatar
f*b
58
mark
avatar
m*i
59
mark

【在 f*****n 的大作中提到】
: 一道RF的面试题:
: 有N个ad, (n是million级别的)
: 每个ad的表示为(id, value)
: 比如:
: 121 -> new
: 130 -> new york
: 145 -> new york time square
: 156 -> new york department store
: 假设有一 query = new york department store
: 规定ad中每个单词都包含在query中时,这个ad为valid (即ad是query的子集)

avatar
s*e
60
为什么前面人说用inverted index 或 hash 什么的?
我看就是普通的trie嘛。从根往下走,记住沿路的叶子点(有flag的点)。

【在 h*****n 的大作中提到】
: inverted index
: IR里面的经典问题

avatar
h*d
61
suffix tree?

【在 f*****n 的大作中提到】
: 一道RF的面试题:
: 有N个ad, (n是million级别的)
: 每个ad的表示为(id, value)
: 比如:
: 121 -> new
: 130 -> new york
: 145 -> new york time square
: 156 -> new york department store
: 假设有一 query = new york department store
: 规定ad中每个单词都包含在query中时,这个ad为valid (即ad是query的子集)

avatar
s*r
62
用bloom filter可能能解决这个问题。
预处理,每一个广告单词hash后建立bloom filter,例如广告130 new york对应的bloom
filter可能是
10001001
145对应的是
11011111
查询时
把query string里面的每个单词hash后建立一个bloom filter的表格,例如是
10011111
比较10001001 和10011111,可以看出广告130每个单词都极可能在query string里面出
现。
广告145不符合要求,因为第二位的bit是1,而query第二位是0
avatar
c*n
63
bloom filter没法满足复杂度要求吧?
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。