求助计软件院童鞋,几题数据结构大作业题目题目需要解答,在线等

百度搜索框的suggestion,比如输入北京,搜索框下面会以北京为前缀,展示&北京爱情故事&、&北京公交&、&北京医院&等等搜索词。
如何设计使得空间和时间复杂度尽量低。
在字符串集合S中,找出相同前缀P的字符串。
设size(S) = N,查询次数为M。
1.朴素方案
朴素得,每次查询时,遍历整个字符串集合,比较每个字符串的前缀。
时间复杂度T(N*len(P)) = O(N),这里的len(P)是一个常数值,所以不会对大O造成影响,参见。
那总的时间复杂度就是O(MN),不使用额外空间,则空间复杂度为O(1)。
1 for Si in S:
if prefix(Si, P):
2.离线处理方案
想一下方案1,我们大部分时间浪费在了很多不可能的比较上。
如,字符串集合中有&南京&,&上海青年&等,跟&北京&前缀毫无关系的词。
为了优化这部分计算,我们先对字符串集合进行排序,然后二分查找到前缀相关位置,接着遍历,如果遇上没有该前缀的词,就可以停止遍历。
因为后续的词不可能再有相关前缀,这一特性是字典序后的集合保证的。
2 i = lower_bound(S, P)
3 for i = i to N:
if not prefix(S[i], P):
print S[i]
排序是在第一次查询前先预处理的,后续不需再调用。
假设每次查询获得条目数为R,所以时间复杂度T(NlogN + M(logN + R))。
但我们这里定义R为常量,因为真实应用上显示条目上限是有限制的,像baidu就只有10个。
那时间复杂度就是O(NlogN + MlogN)。
集合S在这个方案中最好使用数组保存,随机读写效率高。
当然也能使用自平衡树,如std::set,虽然set排序也是O(NlogN),但由于其结构的复杂性,实际效率会有几倍的差弱于快排。
3.在线处理方案
离线跟在线最大的区别,在于离线的字符串集合S是固定,而在线的话集合S会有增加、删除、更新操作。
所以在线处理的难度大于离线,离线问题可以认为是在线问题的子集。
假如在M次查询过程中,加入L次更新操作。在直接套用离线处理方案的情况下,时间复杂度为O(LNlogN + MlogN)。
显然这时查询不是瓶颈,反而预处理拖了后腿。
这里,我们推荐使用,为什么选择字典树?因为它满足这些需求:
1.更新和查找操作与字符串长度有关,时间复杂度O(1),保证了效率。
2.树的遍历顺序隐含了字典顺序,不需显式排序,跳过预处理瓶颈。
1 def find_prefix(node, deep):
if empty(node):
if deep == len(P):
#找到完整P
return all_son(node)
#返回该子树所有叶节点
#递归遍历子树
find_prefix(son(node, P[deep]), deep+1)
Trie处理流程大致是这样的,单次查询的时间复杂度为O(1)。在线的处理方式当然也能用在离线上,但这两者的效率谁高谁低?从时间复杂度上,O(logN)对O(1),似乎没有啥可比性,但在实践中我们要考虑一些其他因素。
首先,数组的下标访问速度优于树的指针访问(关于这点大家可以反汇编,不要迷信教科书上指针访问必定快于下标访问的结论,这点效率虽然有差,但现代编译器会很好的优化相关代码)。
其次,获取结果的效率,数组的顺序访问也优于树的遍历。树有中间节点的时间消耗,且数组能比较好得被Cache到。
再者,即使N=1G=2^30,logN=30而已,O(logN)数量级和O(1)相比其实不算多坏。
使用数组的方案在实际情况下,往往表现优于Trie,而且程序编写难度低,调试方面也相对轻松。
最最关键的是,Trie在工程上应用面很窄,根本不像其在理论上来的那样强大。
朴素的Trie一般应用在英文场景,数据集庞大且重复率很高的情况下比较适用。
原因就是Trie太费内存,不能应用于中文。基本上可以说,不改造不优化,Trie就是废材。
但Trie多路查找的思想确实很重要,很多变种能得到很好的时空效率。
有些程序员会迷恋甚至迷信各种数据结构在理论上带来的结果,其实我们更应该看清本质,这也是我想写有深度的分析稿子的原因。&关于Trie的优化和改造相关内容,我会再整理一份稿子奉上的,这里先作为一个案例引用。
3.2改造方案
现在的问题是,在线处理我们需要像Trie这样的多路查找树特性,而且要能支持中文。
这里我们可以转换下思路,可以把中文转换成拼音,这样又可以直接套用Trie,只不过多了中文转拼音一个步骤。
转拼音其实不难,就是做个表进行映射下就好了,GBK2.0标准中也就27000+个汉字,处理详细方法在这不累述,请自行google。
如上图,朴素的Trie是按英文字母做边的,而拼音是声母和韵母作为单元。
比如&好&hao,&双&shuang,Tire的做法会使树中间节点冗余,影响查找效率,最重要的是导致内存浪费。
优化方法是将Trie对英文字母的映射改成声母和韵母的映射。
哈,这个说起来简单,实现起来还是有要注意的地方。
Trie对字母的映射,可以简单得开个数组,类似ptr[26],然后映射就很简单,比如ptr[ch-'a']。
而声母和韵母的映射没这么简单,一般方法就是枚举、二分查找、map、hash,虽然集合不大,但或多或少都需要耗费些时间。
但这个是为减少空间浪费做的一点点时间牺牲,在工程实践上是完全值得的。
有童鞋会说,既然声母和韵母还是要映射,为什么不直接映射中文?
其实不映射中文的原因,在于中文处理本身有难度,字符集大,词组间相同前缀较短,容易给树结构的内存问题雪上加霜。
用拼音的方法,容易合并相关前缀,比如同音不同字的情况。
当然这些空间优势也需要付出一定的时间花费,就是在节点上保存相关词组。
比如图例中的shuang,它可能是&双&,也可能是&爽&。这在查询前缀较短的情况下,词组候选集过大,导致额外的性能瓶颈。
说到这里的时候,大家可能有点迷糊了,既然中文的查找树太费内存不可用,而拼音的查找树又会退化,那怎么解决才好?
在这,我想表明我自己的一个观点,就是特定的复杂的应用应该有量身定做的算法和数据结构,教科书上不可能有现成的方案。所以一个优秀程序员的必经之路,必须要能融会贯通,然后构建出自己的解决方案。
概括下我的思路。对于有更新的在线处理,我们如果采用多路查找树的思想(我这不提Trie了,因为Trie已经被改造的面目全非),可以既照顾到数据集的更新也能兼顾查询效率,两者的时间复杂度都和操作的字符串长度有关,这已是极小的时间花费。
从汉字转为拼音,虽然无法直接映射汉字,导致同音词查询新子问题的出现,但换来了空间可用性。
因而打开了一种新的思路,在这里拼音做了类似一级索引的工作,同音字的筛选就能在小数据集中操作。
上图中,红色表示一级索引,绿色表示二级索引,蓝色表示数据集(蓝色是冗余数据优化),不同的图形表示不同的数据结构。这样在工程上的好处是可以结合多个不同数据结构各自的优点。
一级索引查找方式类似Trie,二级索引可以使用set、map、hash等关联结构,数据集可以使用list、vector等顺序结构。
使用STL的童鞋可以在中查询各种结构的用法。
3.3改造方案优化
我们来分析下复杂度,首先分析查询时间复杂度(不算蓝色优化部分)。
一级索引查找时间跟前缀拼音长度有关T(Len(P))。子树遍历跟其大小有关,最坏能到达O(N)。
遍历子树是多路查找树的通病,因为它的中间节点不保存子节点信息,当然你可以选择冗余保存(就是蓝色的功能)。
离线处理时我们说过,实践中结果集R会是一个常数值,所以别担心O(N),这里我们换成T(R)来计算。
当一级索引节点有匹配时,进入二级索引,这里我们使用STL的set结构来分析。
set使用iterator遍历时,它是字典序的,所以使用lower_bound + iterator就能搞定,时间复杂度是O(logN) + T(R)。
最坏情况下,每个有效节点(除去不完整的拼音节点)只有一个词,这样需要遍历R个有效节点。
时间复杂度为Len(P) + R*(O(logN) + R) = Len(P) + R*O(logN) + R*R,因为Len(P)和R都是常数值,所以最后查询的时间复杂度为O(logN)。
插入操作的流程跟查询类似,时间复杂度也相同,在这就略过了。
从这个角度讲,大家不要太过于迷信大O分析,这只是很粗略的上界,它保证时间效率上的可用性,不代表它的实际运行效率。
所以,见到O(logN)跑的比O(N^2)都慢的程序也是很正常的,很多细节的优化,往往都是根据相关数据和特点在大O系数和常数间挣扎。
3.4自平衡树
估计很多童鞋看上字典树的处理方案已经很头大了,有没有又方便又快捷的方案?
当然有,离线处理我们提到过自平衡树,如std::set,std::map。
在线处理中就很好的用到了它的插入特性,时间复杂度为O(logN)。
然后依然使用lower_bound + iterator方法查询。
这样它的插入和查询也都是O(logN),那上面的方案跟平衡树方案效率是等同的?
此时,我希望大家能从字典树的复杂度分析过程中找到些灵感,这里我不详述红黑树理论,可参见。
好久不写技术blog,语言描述有很多含糊的地方,欢迎各位童鞋指正。
也欢迎提供有趣的题目和更有深度的解法和思路,真心希望程序员这个圈子有更浓技术氛围。
再次欢迎来稿,或者探讨技术相关问题。
阅读(...) 评论()ZOJ1000题纪念帖 && 给后来的童鞋留一点肺腑之言
7月集训失败之后,8月一直在反思过去走的弯路,为自己的未来作打算,很想写一篇总结,但是拖到了现在,因为有太多的东西需要整理~这一个月还是在ZOJ上刷题,主要做了网络流和博弈论这块,这部分题目是我最近的一个非常重要的探索,也在一定程度上为我以后的学习之路指明了方向,其他的就是一些杂题和大自然题,模拟coding和搜索偏多,然后就是3次ZOJ的比赛题目,东拼西凑总算是刷到1000题了,只是希望实现一年前刚接触ACM时的千题梦而已~以后应该就不会再花很多时间刷题了,周末也许会和小王子一起做做各个OJ的比赛,我有很多漏洞需要弥补,这一年虽然在ACM上面进步很快,却始终摆脱不了急功近利的阴影,最后被淘汰虽然在我意料之外,却也是情理之中接下来要把考研作为第一目标,前几天看了一下李永乐的考研数学复习全书,发现大一学的微积分和线性代数基本都忘光了。。。形势严峻啊,而且我还不能仅仅局限于考研数学,否则我的ACM水平永远都上不了更高的台阶~给后来的童鞋留一些肺腑之言,是否有用自行判断,我只是希望后来者能少走一点弯路=============================================================ACM不是一条平坦的路,刚接触的时候可以凭借自己的热情一股劲走得很快很远,但是越到后面就越困难,平稳的心态是搞ACM所必须的,我想把我学习数据结构的经历写出来,希望能作为前车之鉴大二秋学期有了数据结构课,我开始学习队列,堆栈,树和图论,此时我的ACM已起步2个月,在ZOJ上疯狂的刷了300题,而从数据结构课开始,我在网上学会了一些STL的用法,直接用STL来代替了很多数据结构和算法的手工实现。。当我第一次用qsort()和priority_queue()实现了nlogn的算法时,我就沉醉于STL的便利之中,于是书上对qsort和堆排序的详细分析我就再也没认真看过,另外数据结构课还介绍了hash和并查集的用法,而我在ZOJ上还从来没遇到过需要这些数据结构的题,所以当时也没认真学,等我真正使用hash和并查集的时候已经是考试结束之后一个多月了~最后数据结构的考试我只拿了60多分,因为试题全是考qsort的详细步骤分析,考最大堆push和pop后每一步的结果,考hash的模拟,而我只知道最大堆每次pop出来的都是最大值,却完全不知道最大堆的树形结构到底是如何变化的~一个搞ACM的人,数据结构却差点不及格,何其讽刺!很遗憾,当时我并没有意识到错误的严重性,我给家里的解释是:&考卷全部考的是底层的具体实现,而我已经会使用这些数据结构的接口函数来实现高级的算法了&冬学期学高级数据结构课,这次学的是左式堆,二项队列,伸展树,B树之类的高级数据结构,同时还学了dp,贪心等算法,那个时候我已经做了很多dp的题目了,所以这门课的算法这一块对于我来说很轻松,于是我平时又不去上课,而上面那些诸如左式堆之类的数据结构手工实现比较复杂,我在做题的过程中又几乎没用到过,就觉得这些东西学了也没什么大用,直到考前才稍微看了一下,最后考卷又是考的高级数据结构的手工模拟,于是我又是60多分~知其然却不知其所以然,这是我在ACM路上犯的第一个错误,如今想起来也是相当后悔,数据结构在算法设计中是基础中的基础,当时我仅凭自己在ZOJ上的做题经验来评判一种数据结构的好坏,实在是非常浅薄~我的数据结构基础不稳,高级数据结构这一块基本空白,对我大二下学期的ACM进展影响很大大二下学期的时候,我已经做了很多搜索题,dp题,最短路题,模拟题,代码都写烂了。。我渴望有新的进步,于是开始接触新
分享这篇日志的人也喜欢
小哥哥在那里
无聊的小姐姐
在播一会睡觉
你永远不懂我伤悲
尬聊主播已上线
祝主播生日快乐手机显示不了进来的人
热门日志推荐
人人最热标签
北京千橡网景科技发展有限公司:
文网文[号··京公网安备号·甲测资字
文化部监督电子邮箱:wlwh@··
文明办网文明上网举报电话: 举报邮箱:&&&&&&&&&&&&
请输入手机号,完成注册
请输入验证码
密码必须由6-20个字符组成
下载人人客户端
品评校花校草,体验校园广场&&&&数据结构习题解答与实验指导/21世纪高等院校计算机教材
自营订单满39元(含)免运费
不足金额订单收取运费5元起
邀请好友参加吧
版 次:1页 数:166字 数:259000印刷时间:日开 本:纸 张:胶版纸印 次: 包 装:平装是否套装:否国际标准书号ISBN:1丛书名:21世纪高等院校计算机教材所属分类:&&&&&&&&
下载免费当当读书APP
品味海量优质电子书,尊享优雅的阅读体验,只差手机下载一个当当读书APP
本商品暂无详情。
当当价:为商品的销售价,具体的成交价可能因会员使用优惠券、积分等发生变化,最终以订单结算页价格为准。
划线价:划线价格可能是图书封底定价、商品吊牌价、品牌专柜价或由品牌供应商提供的正品零售价(如厂商指导价、建议零售价等)或该商品曾经展示过的销售价等,由于地区、时间的差异化和市场行情波动,商品吊牌价、品牌专柜价等可能会与您购物时展示的不一致,该价格仅供您参考。
折扣:折扣指在划线价(图书定价、商品吊牌价、品牌专柜价、厂商指导价等)某一价格基础上计算出的优惠比例或优惠金额。如有疑问,您可在购买前联系客服咨询。
异常问题:如您发现活动商品销售价或促销信息有异常,请立即联系我们补正,以便您能顺利购物。
当当购物客户端手机端1元秒
当当读书客户端万本电子书免费读后使用快捷导航没有帐号?
查看: 2581|回复: 6
求助~~~数据结构1800题的全名
中级战友, 积分 521, 距离下一级还需 2479 积分
在线时间133 小时
主题帖子积分
中级战友, 积分 521, 距离下一级还需 2479 积分
中级战友, 积分 521, 距离下一级还需 2479 积分
数据结构1800题的全名是什么啊?是不是算法与数据结构考研考试题精析啊?????
新手上路, 积分 31, 距离下一级还需 69 积分
在线时间9 小时
主题帖子积分
新手上路, 积分 31, 距离下一级还需 69 积分
新手上路, 积分 31, 距离下一级还需 69 积分
对的 刚买过{:soso_e100:}
中级战友, 积分 521, 距离下一级还需 2479 积分
在线时间133 小时
主题帖子积分
中级战友, 积分 521, 距离下一级还需 2479 积分
中级战友, 积分 521, 距离下一级还需 2479 积分
多点阳光 发表于
对的 刚买过
怎么样啊?好做不啊?
一般战友, 积分 387, 距离下一级还需 113 积分
在线时间104 小时
主题帖子积分
一般战友, 积分 387, 距离下一级还需 113 积分
一般战友, 积分 387, 距离下一级还需 113 积分
选择题做做就可以了
威望158373
K币16412 元
在线时间8438 小时
主题帖子积分
威望158373
K币16412 元
论坛下载区有电子版的,题目都是各校真题,值得一做。
没错,我就是传说中低调的阿亮…
中级战友, 积分 521, 距离下一级还需 2479 积分
在线时间133 小时
主题帖子积分
中级战友, 积分 521, 距离下一级还需 2479 积分
中级战友, 积分 521, 距离下一级还需 2479 积分
狂风过后 发表于
选择题做做就可以了
哦,好的~谢谢了~
中级战友, 积分 521, 距离下一级还需 2479 积分
在线时间133 小时
主题帖子积分
中级战友, 积分 521, 距离下一级还需 2479 积分
中级战友, 积分 521, 距离下一级还需 2479 积分
yylsky 发表于
论坛下载区有电子版的,题目都是各校真题,值得一做。
恩恩,我一会去下载
在这里,追忆似水年华
考研论坛站务
考研论坛2009年优秀版主
考研论坛2009年优秀版主
您还剩5次免费下载资料的机会哦~
扫描二维码下载资料
使用手机端考研帮,进入扫一扫在“我”中打开扫一扫,扫描二维码下载资料
Powered by Discuz!求助计算机学院上过数据结构和C++程序设计的童鞋【天津大学吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:190,565贴子:
求助计算机学院上过数据结构和C++程序设计的童鞋收藏
天大女研究僧一枚,同学考研,想了解下数据结构和C++程序设计课程的一些情况,有木有小伙伴伸出援手嘞~~可以的话请回复,我会私信你。只问几个问题,绝不骚扰!良心保证!
自己顶。。。
学姐你好,上数据结构的默默路过……
请问下,你们学习的C++和数据结构都是哪两本书呀
登录百度帐号推荐应用

我要回帖

更多关于 数据结构考研题目 的文章

 

随机推荐