1.猎豹常常要根据商家的要求,把广告推送给具备不同标签的用户。比如用的用户可能对3c和toys感兴趣,有的可能对汽车感兴趣。我们有一个矩阵。
t1 t2 t3...... tn
user1 0 1 0 1
user2 0 1 1 0
...
...
usern 1 1 0 1
矩阵中的元素,代表用户对列标签是否感兴趣。
问题:商家给定一个标签序列比如t1t3t5t7,怎么求出系统中有多少用户对这些标签感兴趣,注意,标签序列是或的性质,不要求精确求解,只需要估计出一个大概的数值。
解答:这一题,我一开始的想法是直接的按列或操作。但是这样的话,复杂度会非常大。比如说,商家甲要求的标签是t1t2t3,商家乙要求的标签是t1t2...tn,这样的话,每来一个商家,就需要进行一次与操作。算法效率很低下。
后来面试官提醒我,可以从概率的角度进行思考。比如说要求p1Up2...Upn的概率(在这里p1指的是对t1标签感兴趣的用户的概率,其他类似),可以按照下图进行求得。
上面的推导其实用到了德·摩根律,公式如下:
-
- (A ∪B)C = AC ∩BC
- (A ∩B)C = AC ∪BC
-
2.面试官问到了我一点,末次点击率是怎么计算出来的。我当时不知道怎么回答。到公司之后,希望可以问下公司的同事,那个0.5的含义。
-
3.建堆的时间复杂度
- 建立一个堆,有两种建堆方式。一种是逐个插入,一个是先是乱序,之后从[NodeNum/2...1]进行 下滤 操作。无论是哪一种建堆方法,时间复杂度都是 O(n) 。
- 记住,只有 插入的时候用到上滤操作 ,删除和建堆的时候,都是用到 下滤操作 !!!