May 2009 - May 2017 论坛八周年-你的足迹,我的骄傲


一亩三分地论坛

 找回密码
 获取更多干活,快来注册

一亩三分地官方iOS手机应用下载
查看: 1717|回复: 16
收起左侧

[算法题] 请问一道Google onsite题

[复制链接] |试试Instant~ |关注本帖
handsomecool 发表于 2016-6-10 12:26:44 | 显示全部楼层 |阅读模式

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

您需要 登录 才可以下载或查看,没有帐号?获取更多干活,快来注册

x
在这个帖子看到的,希望大家讨论下思路。
http://www.1point3acres.com/bbs/thread-168330-1-1.html

类似Lint code data stream median, 写个API,有两个方法,addURL(String url) 和 getURL(),getURL()返回的是目前为止所有URL长度的中位数。lz使用两个heap做的。follow-up: what if we know the range of the input,比如我们知道URL的大小不会超过2k,那有没有别的implement的方法。这个没想出来请大家指教。


我感觉可以开一个size=2k的数组记录频次,每次拿到一个长度的url, 就把那个长度的频次加一,同时记录总的url数量,要找中位数时就从左往右累加频次,直到等于总数的一半。这种做法set是O(1), get可以勉强也算是O(1), 其实是O(2k), 把2k当做常数了

有更好的办法吗?

评分

1

查看全部评分

blackrose 发表于 2016-6-10 13:07:14 | 显示全部楼层
关注一亩三分地公众号:
Warald_一亩三分地
已知range的话,不是quickselect了么。。。
回复 支持 反对

使用道具 举报

 楼主| handsomecool 发表于 2016-6-10 13:25:54 | 显示全部楼层
关注一亩三分地微博:
Warald
blackrose 发表于 2016-6-10 13:07
已知range的话,不是quickselect了么。。。

没明白咋搞,举个例子呗。。

比如range为[0,100], input还是无限stream
回复 支持 反对

使用道具 举报

blackrose 发表于 2016-6-10 13:26:44 | 显示全部楼层
handsomecool 发表于 2016-6-10 13:25
没明白咋搞,举个例子呗。。

比如range为[0,100], input还是无限stream

那我理解错了,我当成你说的range 是input size了。。。。
回复 支持 反对

使用道具 举报

 楼主| handsomecool 发表于 2016-6-10 13:41:44 | 显示全部楼层
blackrose 发表于 2016-6-10 13:26
那我理解错了,我当成你说的range 是input size了。。。。

哦哦
没事
回复 支持 反对

使用道具 举报

hakase 发表于 2016-6-10 14:02:07 | 显示全部楼层
都优化到常数了,教授说你博士可以毕业了。
回复 支持 反对

使用道具 举报

blackrose 发表于 2016-6-10 14:14:48 | 显示全部楼层
hakase 发表于 2016-6-10 14:02
都优化到常数了,教授说你博士可以毕业了。

input 怎么就不能提出来 follow up 为常数呢? 酸别人的好处是啥,我其实一直不懂
回复 支持 反对

使用道具 举报

hakase 发表于 2016-6-10 14:18:09 | 显示全部楼层
blackrose 发表于 2016-6-10 14:14
input 怎么就不能提出来 follow up 为常数呢? 酸别人的好处是啥,我其实一直不懂

我的意思是楼主已经把两个操作时间复杂度优化到常数级别,应该没法再优化了,所以问题已经解决了。不是酸别人。
回复 支持 反对

使用道具 举报

 楼主| handsomecool 发表于 2016-6-10 14:55:09 | 显示全部楼层
哈哈,没事,不酸不酸。
我只是看到有人讨论说用数组存累积的频次,不知道那样会不会更好?Get是真的O(1)了,但是Set好像就麻烦多了。。
回复 支持 反对

使用道具 举报

hakase 发表于 2016-6-10 15:19:26 | 显示全部楼层
handsomecool 发表于 2016-6-10 14:55
哈哈,没事,不酸不酸。
我只是看到有人讨论说用数组存累积的频次,不知道那样会不会更好?Get是真的O(1) ...

确实用楼主所说的方法两种操作都是O(1),都是常数级别。所以我觉得两个API操作,虽然后者看起来常数项略大一些,但是不影响其时间复杂度是常数的性质。

记得当年我们算法课的老教授在黑板上写了个O(10^1000...) = O(1);至今记忆犹新。

我觉得这个问题再和面试官讨论下去的话最好是画张图,讲下两种算法时间复杂度的交点。说明问题规模在什么规模以下时用前者(大顶堆+小顶堆)比较好。

估计面试官考的也是“扫描数组就是O(n)”这一错误思维定式。
回复 支持 反对

使用道具 举报

readman 发表于 2016-6-10 21:37:55 | 显示全部楼层
hakase 发表于 2016-6-10 15:19
确实用楼主所说的方法两种操作都是O(1),都是常数级别。所以我觉得两个API操作,虽然后者看起来常数项略 ...

我记忆犹新的是bb家的一个电面题,

反转打印链表, 然后空间复杂度 o(1), 我当时就傻了..............
回复 支持 反对

使用道具 举报

blackrose 发表于 2016-6-10 22:02:55 | 显示全部楼层
readman 发表于 2016-6-10 21:37
我记忆犹新的是bb家的一个电面题,

反转打印链表, 然后空间复杂度 o(1), 我当时就傻了..............

reverse print linked list  是可以O(1)空间复杂度的。。。。
回复 支持 反对

使用道具 举报

hakase 发表于 2016-6-11 00:05:56 | 显示全部楼层
readman 发表于 2016-6-10 21:37
我记忆犹新的是bb家的一个电面题,

反转打印链表, 然后空间复杂度 o(1), 我当时就傻了..............

是指这种方法?
1. 扫描原有链表,讲原有链表从头到尾指针两两转向。
2. 扫描转向过的链表,因为链表已经改变方向,头是原来的尾,反之亦然。所以按正常遍历顺序输出即可。

因为在原有链表上修改,所以空间复杂度是交换指针用的临时空间,O(1)(实际上swap进一步优化可以不用空间)。
时间复杂度很直给,是O(N) N:length of the linked list

第二种是递归,不过递归终究有栈的深度在,所以可能空间复杂度谈不上是O(1)。

回复 支持 反对

使用道具 举报

blackrose 发表于 2016-6-11 00:37:46 | 显示全部楼层
hakase 发表于 2016-6-11 00:05
是指这种方法?
1. 扫描原有链表,讲原有链表从头到尾指针两两转向。
2. 扫描转向过的链表,因为链表已 ...

wait。。。。我说错了, sorry,怎么着都是O(n),早上没喝咖啡。。。。
回复 支持 反对

使用道具 举报

readman 发表于 2016-6-11 03:15:29 | 显示全部楼层
blackrose 发表于 2016-6-11 00:37
wait。。。。我说错了, sorry,怎么着都是O(n),早上没喝咖啡。。。。

是啊。。。如果压栈没有空间复杂度, 那谁还写迭代- -
回复 支持 反对

使用道具 举报

hakase 发表于 2016-6-11 09:37:56 | 显示全部楼层
readman 发表于 2016-6-11 03:15
是啊。。。如果压栈没有空间复杂度, 那谁还写迭代- -

是啊,这题用不了尾递归。
回复 支持 反对

使用道具 举报

larry_cn 发表于 2016-8-19 07:09:55 | 显示全部楼层
设定一个 2k的 数组 两个 类似minheap 和 maxheap的 指针(minp 和 maxp) 指向长度的位置
minp 和maxp 两个边界有count  然后 记录当前是  奇数还是偶数
奇数时 两个指针 指向一处 如果 偶数 可能不指向一处
根据 输入大小 和 两变count 移动 指针  这样的 话 应该 时 const

input len 5:  0, 0, 0, 0, 1, 0, ...      minp = maxp = 5
input len 3:  0, 0, 1, 0, 1, 0, ...      minp = 3, maxp = 5
input len 4:  0, 0, 1, 1, 1, 0, ...      minp = maxp = 4
input len 4:  0, 0, 1, 2, 1, 0, ...      minp = maxp = 4

回复 支持 反对

使用道具 举报

本版积分规则

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2017-5-23 09:36

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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