• 关于

    二分查找算法

    的搜索结果

问题

用C语言编写非递归算法实现折半查找(二分查找)

知与谁同 2019-12-01 20:16:30 433 浏览量 回答数 2

问题

用C语言编写非递归算法实现折半查找(二分查找)

知与谁同 2019-12-01 20:16:14 350 浏览量 回答数 1

问题

二分排序法的算法思想是什么?如何进行二分排序?...不是插入和查找

知与谁同 2019-12-01 20:11:07 343 浏览量 回答数 2

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

  907数据结构与算法满分是150分。   考试科目代码及名称:907数据结构与算法   一、考试基本要求   本考试大纲适用于报考深圳大学计算机与软件学院学术型硕士的研究生入学考试。《数据结构与算法》是为招收计算机科学与技术学术型硕士和软件工程学术型硕士而设置的具有选拔功能的水平考试。它的主要目的是测试考生对数据结构与算法各项内容的掌握程度。要求考生熟悉常见的数据结构和算法,能根据实际应用选择合理的逻辑结构、存储结构及其相应的算法,并掌握算法的时间分析和空间分析技术。要求考生能够编写符合软件工程规范、结构清楚、正确易读的算法(程序)。   二、考试内容和考试要求 1、 基本概念 逻辑结构、存储结构、算法及三者之间的关系;算法的特征及设计目标;了解算法时间、空间需求的大O表示法 。 2、向量、链表、栈、队 向量(顺序表)、链表(静态链表、单链表、双向链表、循环链表)及相关算法;栈、队,了解其应用,理解递归;串及C语言中串的表示;串的模式匹配算法;了解多维数组的行优先和列优先的顺序存储;了解特殊矩阵(如上、下三角矩阵)的一维数组存储 ,了解广义表的表示。 3、树和二叉树 树(森林)、二叉树及其性质;两者的对应关系;二叉树的llink-rlink和完全二叉树的顺序存储法;二叉树遍历;赫夫曼(Huffman)树的构造及应用 。 4、图 图(网)的概念及其邻接矩阵和邻接表存储法;图的遍历、最小生成树、最短路径、拓扑排序、关键路径等算法 。 5、查找与排序 顺序查找、二分查找;二叉排序树、平衡二叉排序树及插入、删除时的平衡方法;B-树、B+树;哈希(Hash)表;了解查找成功及失败的平均查找长度;排序的概念及相关术语;“插入”、“希尔”、“起泡”、“快速”、“选择”、“堆”、“归并”、“基数”等排序算法;了解上述排序算法的时间复杂度、空间复杂度、稳定性;了解上述部分排序算法的适用场合 。   三、考试基本题型 主要题型包括:填空题、选择题、判断题、应用题、算法设计题等。试卷满分为150分。   

小哇 2019-12-02 01:23:55 0 浏览量 回答数 0

问题

数据结构作业:试写出递归的二分查找算法,求大神帮忙写一下代码!!

知与谁同 2019-12-01 20:15:22 359 浏览量 回答数 1

问题

【今日算法】4月14日-koko偷香蕉

游客ih62co2qqq5ww 2020-04-14 22:00:19 10 浏览量 回答数 1

回答

算法描述 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 将新元素插入到该位置后 重复步骤2~5 如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找排序。 范例程式码 void insertion_sort(int array[], int first, int last) { int i,j; int temp; for (i = first+1; i<=last;i++) { temp = array[i]; j=i-1; while((j>=first) && (array[j] > temp)) { array[j+1] = array[j];  j--; } array[j+1] = temp; } }

一键天涯 2019-12-02 01:18:11 0 浏览量 回答数 0

问题

二分查找及对应经典题目

问问小秘 2020-07-03 16:20:06 3 浏览量 回答数 1

问题

GitHub 热门:Python 算法大全,Star 超过 6 万

珍宝珠 2020-01-14 11:29:39 431 浏览量 回答数 1

回答

曾经因为看不懂数据结构和算法,而一度怀疑是自己太笨,实际上,很多人在第一次接触这门课时,都会有这种感觉,觉得数据结构和算法很抽象,晦涩难懂,宛如天书。正是这个原因,让很多初学者对这门课望而却步,希望以下分享能为初学者排忧解难。 我个人觉得,其实真正的原因是你没有找到好的学习方法,没有抓住学习的重点。实际上,数据结构和算法的东西并不多,常用的、基础的知识点更是屈指可数。只要掌握了正确的学习方法,学起来并没有看上去那么难,更不需要什么高智商、厚底子。 还记得大学里每次考前老师都要划重点吗?今天,我就给你划划我们这门课的重点,再告诉你一些我总结的学习小窍门。相信有了这些之后,你学起来就会有的放矢、事半功倍了。 什么是数据结构?什么是算法? 大部分数据结构和算法教材,在开篇都会给这两个概念下一个明确的定义。但是,这些定义都很抽象,对理解这两个概念并没有实质性的帮助,反倒会让你陷入死抠定义的误区。毕竟,我们现在学习,并不是为了考试,所以,概念背得再牢,不会用也就没什么用。 虽然我们说没必要深挖严格的定义,但是这并不等于不需要理解概念。下面我就从广义和狭义两个层面,来帮你理解数据结构与算法这两个概念。 从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。 图书馆储藏书籍你肯定见过吧?为了方便查找,图书管理员一般会将书籍分门别类进行“存储”。按照一定规律编号,就是书籍这种“数据”的存储结构。 那我们如何来查找一本书呢?有很多种办法,你当然可以一本一本地找,也可以先根据书籍类别的编号,是人文,还是科学、计算机,来定位书架,然后再依次查找。笼统地说,这些查找方法都是算法。 从狭义上讲,是指某些著名的数据结构和算法,比如队列、栈、堆、二分查找、动态规划等。这些都是前人智慧的结晶,我们可以直接拿来用。我们要讲的这些经典数据结构和算法,都是前人从很多实际操作场景中抽象出来的,经过非常多的求证和检验,可以高效地帮助我们解决很多实际的开发问题。 那数据结构和算法有什么关系呢?为什么大部分书都把这两个东西放到一块儿来讲呢? 这是因为,数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构之上。因此,我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。 比如,因为数组具有随机访问的特点,常用的二分查找算法需要用数组来存储数据。但如果我们选择链表这种数据结构,二分查找算法就无法工作了,因为链表并不支持随机访问。 数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构就是没用的。 现在你对数据结构与算法是不是有了比较清晰的理解了呢?有了这些储备,下面我们来看看,究竟该怎么学数据结构与算法。 看到数据结构和算法里的“算法”两个字,很多人就会联想到“数学”,觉得算法会涉及到很多深奥的数学知识。那我数学基础不是很好,学起来会不会很吃力啊? 数据结构和算法课程确实会涉及一些数学方面的推理、证明,尤其是在分析某个算法的时间、空间复杂度的时候,但是这个你完全不需要担心。 学习的重点在什么地方? 提到数据结构和算法,很多人就很头疼,因为这里面的内容实在是太多了。这里,我就帮你梳理一下,应该先学什么,后学什么。你可以对照看看,你属于哪个阶段,然后有针对地进行学习。 想要学习数据结构与算法,首先要掌握一个数据结构与算法中最重要的概念——复杂度分析。 这个概念究竟有多重要呢?可以这么说,它几乎占了数据结构和算法这门课的半壁江山,是数据结构和算法学习的精髓。 数据结构和算法解决的是如何更省、更快地存储和处理数据的问题,因此,我们就需要一个考量效率和资源消耗的方法,这就是复杂度分析方法。所以,如果你只掌握了数据结构和算法的特点、用法,但是没有学会复杂度分析,那就相当于只知道操作口诀,而没掌握心法。只有把心法了然于胸,才能做到无招胜有招! 所以,复杂度分析这个内容,你也一定要花大力气来啃,必须要拿下,并且要搞得非常熟练。否则,后面的数据结构和算法也很难学好。 搞定复杂度分析,下面就要进入数据结构与算法的正文内容了。 为了让你对数据结构和算法能有个全面的认识,我画了一张图,里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点。 但是,作为初学者,或者一个非算法工程师来说,你并不需要掌握图里面的所有知识点。很多高级的数据结构与算法,比如二分图、最大流等,这些在我们平常的开发中很少会用到。所以,你暂时可以不用看。我还是那句话,咱们学习要学会找重点。如果不分重点地学习,眉毛胡子一把抓,学起来肯定会比较吃力。 所以,结合我自己的学习心得,还有这些年的面试、开发经验,我总结了20个最常用的、最基础数据结构与算法,不管是应付面试还是工作需要,只要集中精力逐一攻克这20个知识点就足够了。 这里面有10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树;10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。 掌握了这些基础的数据结构和算法,再学更加复杂的数据结构和算法,就会非常容易、非常快。 与此同时,为了帮助大家学习算法,准备了一份学习资料,获取方式:关注我的公众号“程序媛不是程序猿”,回复“算法”即可弹出领取地址。对于新手来说很适用。 在学习数据结构和算法的过程中,你也要注意,不要只是死记硬背,不要为了学习而学习,而是要学习它的“来历”“自身的特点”“适合解决的问题”以及“实际的应用场景”。对于每一种数据结构或算法,我都会从这几个方面进行详细讲解。只要你掌握了《数据结构与算法之美》每节课里讲的内容,就能在开发中灵活应用。 学习数据结构和算法的过程,是非常好的思维训练的过程,所以,千万不要被动地记忆,要多辩证地思考,多问为什么。如果你一直这么坚持做,你会发现,等你学完之后,写代码的时候就会不由自主地考虑到很多性能方面的事情,时间复杂度、空间复杂度非常高的垃圾代码出现的次数就会越来越少。你的编程内功就真正得到了修炼。 一些可以让你事半功倍的学习技巧 前面我给你划了学习的重点,作为一个过来人,现在我就给你分享一下,学习的一些技巧。掌握了这些技巧,可以让你化被动为主动,学起来更加轻松,更加有动力! 边学边练,适度刷题 “边学边练”这一招非常有用。建议你每周花1~2个小时的时间,集中把这周的三节内容涉及的数据结构和算法,全都自己写出来,用代码实现一遍。这样一定会比单纯地看或者听的效果要好很多! 有面试需求的同学,可能会问了,那我还要不要去刷题呢? 我个人的观点是可以“适度”刷题,但一定不要浪费太多时间在刷题上。我们学习的目的还是掌握,然后应用。除非你要面试Google、Facebook这样的公司,它们的算法题目非常非常难,必须大量刷题,才能在短期内提升应试正确率。如果是应对国内公司的技术面试,即便是BAT这样的公司,你只要彻底掌握这个专栏的内容,就足以应对。 多问、多思考、多互动 学习最好的方法是,找到几个人一起学习,一块儿讨论切磋,有问题及时寻求老师答疑。但是,离开大学之后,既没有同学也没有老师,这个条件就比较难具备了。 打怪升级学习法 学习的过程中,我们碰到最大的问题就是,坚持不下来。是的,很多基础课程学起来都非常枯燥。为此,我自己总结了一套“打怪升级学习法”。 游戏你肯定玩过吧?为什么很多看起来非常简单又没有乐趣的游戏,你会玩得不亦乐乎呢?这是因为,当你努力打到一定级别之后,每天看着自己的经验值、战斗力在慢慢提高,那种每天都在一点一点成长的成就感就不由自主地产生了。 知识需要沉淀,不要想试图一下子掌握所有 在学习的过程中,一定会碰到“拦路虎”。如果哪个知识点没有怎么学懂,不要着急,这是正常的。因为,想听一遍、看一遍就把所有知识掌握,这肯定是不可能的。学习知识的过程是反复迭代、不断沉淀的过程。 这些内容是我根据平时的学习和工作、面试经验积累,精心筛选出来的。只要掌握这些内容,应付日常的面试、工作,基本不会有问题。 以上内容出自近70000+程序员的算法课堂《数据结构与算法之美》,这个专栏是市面上唯一一门真正适用于工程师的专栏,专栏中列举大量实际软件开发中的场景,给你展示如何利用数据结构和算法解决真实的问题。整个专栏会涵盖100 多个算法真实项目场景案例,更难得的是它跟市面上晦涩的算法书籍不同的是,还手绘了一些清晰易懂的详解图(总共有 300 多张)。 手绘图—出自《数据结构与算法之美》 专栏已经更新完毕,72 篇文章,27 万字,这个专栏作者并非只是单纯地把某个知识点讲清楚,而是结合作者的理解、实践和经验来讲解,我相信它是一个跟所有国内、国外经典书籍都不一样的专栏,一个可以长期影响一些人的专栏。 这个专栏不会像《算法导论》那样,里面有非常复杂的数学证明和推理。作者会由浅入深,从概念到应用,一点一点给你解释清楚。你只要有高中数学水平,就完全可以学习。 当然,当然希望你最好有些编程基础,如果有项目经验就更好了。这样给你讲数据结构和算法如何提高效率、如何节省存储空间,你就会有很直观的感受。因为,对于每个概念和实现过程,作者都会从实际场景出发,不仅教你“是什么”,还会教你“为什么”,并且告诉你遇到同类型问题应该“怎么做”。 强烈推荐这个专栏给想攻克算法的同学,它改变了无数对算法恐惧的同学,我整理了一些专栏的评价给大家参考。

游客arp6khj2dsufi 2019-12-02 03:09:08 0 浏览量 回答数 0

回答

Python数据结构篇 数据结构篇主要是阅读[Problem Solving with Python](Welcome to Problem Solving with Algorithms and Data Structures) [该网址链接可能会比较慢]时写下的阅读记录,当然,也结合了部分[算法导论](Introduction to Algorithms) 中的内容,此外还有不少wikipedia上的内容,所以内容比较多,可能有点杂乱。这部分主要是介绍了如何使用Python实现常用的一些数据结构,例 如堆栈、队列、二叉树等等,也有Python内置的数据结构性能的分析,同时还包括了搜索和排序(在算法设计篇中会有更加详细的介绍)的简单总结。每篇文 章都有实现代码,内容比较多,简单算法一般是大致介绍下思想及算法流程,复杂的算法会给出各种图示和代码实现详细介绍。 **这一部分是下 面算法设计篇的前篇,如果数据结构还不错的可以直接看算法设计篇,遇到问题可以回来看数据结构篇中的某个具体内容充电一下,我个人认为直接读算法设计篇比 较好,因为大家时间也都比较宝贵,如果你会来读这些文章说明你肯定有一定基础了,后面的算法设计篇中更多的是思想,这里更多的是代码而已,嘿嘿。** (1)[搜索](Python Data Structures) 简述顺序查找和二分查找,详述Hash查找(hash函数的设计以及如何避免冲突) (2)[排序](Python Data Structures) 简述各种排序算法的思想以及它的图示和实现 (3)[数据结构](Python Data Structures) 简述Python内置数据结构的性能分析和实现常用的数据结构:栈、队列和二叉堆 (4)[树总结](Python Data Structures) 简述二叉树,详述二叉搜索树和AVL树的思想和实现 2.Python算法设计篇 算法设计篇主要是阅读[Python Algorithms: Mastering Basic Algorithms in the Python Language](Python Algorithms: Mastering Basic Algorithms in the Python Language)[**点击链接可进入Springer免费下载原书电子版**]之后写下的读书总结,原书大部分内容结合了经典书籍[算法导论](Introduction to Algorithms), 内容更加细致深入,主要是介绍了各种常用的算法设计思想,以及如何使用Python高效巧妙地实现这些算法,这里有别于前面的数据结构篇,部分算法例如排 序就不会详细介绍它的实现细节,而是侧重于它内在的算法思想。这部分使用了一些与数据结构有关的第三方模块,因为这篇的重点是算法的思想以及实现,所以并 没有去重新实现每个数据结构,但是在介绍算法的同时会分析Python内置数据结构以及第三方数据结构模块的优缺点,也就意味着该篇比前面都要难不少,但 是我想我的介绍应该还算简单明了,因为我用的都是比较朴实的语言,并没有像算法导论一样列出一堆性质和定理,主要是对着某个问题一步步思考然后算法就出来 了,嘿嘿,除此之外,里面还有很多关于python开发的内容,精彩真的不容错过。 这里每篇文章都有实现代码,但是代码我一般都不会分 析,更多地是分析算法思想,所以内容都比较多,即便如此也没有包括原书对应章节的所有内容,因为内容实在太丰富了,所以我只是选择经典的算法实例来介绍算 法核心思想,除此之外,还有不少内容是原书没有的,部分是来自算法导论,部分是来自我自己的感悟,嘻嘻。该篇对于大神们来说是小菜,请一笑而过,对于菜鸟 们来说可能有点难啃,所以最适合的是和我水平差不多的,对各个算法都有所了解但是理解还不算深刻的半桶水的程序猿,嘿嘿。 本篇的顺序按照原书[Python Algorithms: Mastering Basic Algorithms in the Python Language](Python Algorithms: Mastering Basic Algorithms in the Python Language)的章节来安排的(章节标题部分相同部分不同哟),为了节省时间以及保持原著的原滋原味,部分内容(一般是比较难以翻译和理解的内容)直接摘自原著英文内容。 **1. 你也许觉得很多内容你都知道嘛,没有看的必要,其实如果是我的话我也会这么想,但是如果只是归纳一个算法有哪些步骤,那这个总结也就没有意义了,我觉得这 个总结的亮点在于想办法说清楚一个算法是怎么想出来的,有哪些需要注意的,如何进行优化的等等,采用问答式的方式让读者和我一起来想出某个问题的解,每篇 文章之后都还有一两道小题练手哟** **2.你也许还会说算法导论不是既权威又全面么,基本上每个算法都还有详细的证明呢,读算法导论岂 不更好些,当然,你如果想读算法导论的话我不拦着你,读完了感觉自己整个人都不好了别怪小弟没有提醒你哟,嘻嘻嘻,左一个性质右一个定理实在不适合算法科 普的啦,没有多少人能够坚持读完的。但是码农与蛇的故事内容不多哟,呵呵呵** **3.如果你细读本系列的话我保证你会有不少收获的,需要看算法导论哪个部分的地方我会给出提示的,嘿嘿。温馨提示,前面三节内容都是介绍基础知识,所以精彩内容从第4节开始哟,么么哒 O(∩_∩)O~** (1)[Python Algorithms - C1 Introduction](Python Algorithms) 本节主要是对原书中的内容做些简单介绍,说明算法的重要性以及各章节的内容概要。 (2)[Python Algorithms - C2 The basics](Python Algorithms) **本节主要介绍了三个内容:算法渐近运行时间的表示方法、六条算法性能评估的经验以及Python中树和图的实现方式。** (3)[Python Algorithms - C3 Counting 101](Python Algorithms) 原书主要介绍了一些基础数学,例如排列组合以及递归循环等,但是本节只重点介绍计算算法的运行时间的三种方法 (4)[Python Algorithms - C4 Induction and Recursion and Reduction](Python Algorithms) **本节主要介绍算法设计的三个核心知识:Induction(推导)、Recursion(递归)和Reduction(规约),这是原书的重点和难点部分** (5)[Python Algorithms - C5 Traversal](Python Algorithms) **本节主要介绍图的遍历算法BFS和DFS,以及对拓扑排序的另一种解法和寻找图的(强)连通分量的算法** (6)[Python Algorithms - C6 Divide and Combine and Conquer](Python Algorithms) **本节主要介绍分治法策略,提到了树形问题的平衡性以及基于分治策略的排序算法** (7)[Python Algorithms - C7 Greedy](Python Algorithms) **本节主要通过几个例子来介绍贪心策略,主要包括背包问题、哈夫曼编码和最小生成树等等** (8)[Python Algorithms - C8 Dynamic Programming](Python Algorithms) **本节主要结合一些经典的动规问题介绍动态规划的备忘录法和迭代法这两种实现方式,并对这两种方式进行对比** (9)[Python Algorithms - C9 Graphs](Python Algorithms) https://www.zhihu.com/question/19889750/answer/27901020

青衫无名 2019-12-02 01:23:20 0 浏览量 回答数 0

回答

《编程导论》,作者John V. Guttag,人民邮电出版社 本书涵盖了Python的大部分特性,但侧重点是如何使用这门语言,而不是语言本身。例如,前三章介绍了穷举的概念、猜测和验证算法、二分查找以及高效近 似算法,但只涉及一小部分Python知识。 有一本叫Data Structures and Algorithms with Object Oriented Design Patterns in Python,作者Bruno R. Preiss Problem Solving with Algorithms and Data Structures using Python 作者: Brad Miller and David Ranum

云篆 2019-12-02 01:22:23 0 浏览量 回答数 0

回答

1.Python数据结构篇 数据结构篇主要是阅读[Problem Solving with Python](Welcome to Problem Solving with Algorithms and Data Structures) [该网址链接可能会比较慢]时写下的阅读记录,当然,也结合了部分[算法导论](Introduction to Algorithms)中的内容,此外还有不少wikipedia上的内容,所以内容比较多,可能有点杂乱。这部分主要是介绍了如何使用Python实现常用的一些数据结构,例如堆栈、队列、二叉树等等,也有Python内置的数据结构性能的分析,同时还包括了搜索和排序(在算法设计篇中会有更加详细的介绍)的简单总结。每篇文章都有实现代码,内容比较多,简单算法一般是大致介绍下思想及算法流程,复杂的算法会给出各种图示和代码实现详细介绍。 **这一部分是下面算法设计篇的前篇,如果数据结构还不错的可以直接看算法设计篇,遇到问题可以回来看数据结构篇中的某个具体内容充电一下,我个人认为直接读算法设计篇比较好,因为大家时间也都比较宝贵,如果你会来读这些文章说明你肯定有一定基础了,后面的算法设计篇中更多的是思想,这里更多的是代码而已,嘿嘿。** (1)[搜索](Python Data Structures) 简述顺序查找和二分查找,详述Hash查找(hash函数的设计以及如何避免冲突) (2)[排序](Python Data Structures) 简述各种排序算法的思想以及它的图示和实现 (3)[数据结构](Python Data Structures) 简述Python内置数据结构的性能分析和实现常用的数据结构:栈、队列和二叉堆 (4)[树总结](Python Data Structures) 简述二叉树,详述二叉搜索树和AVL树的思想和实现 2.Python算法设计篇 算法设计篇主要是阅读[Python Algorithms: Mastering Basic Algorithms in the Python Language](Python Algorithms: Mastering Basic Algorithms in the Python Language)[**点击链接可进入Springer免费下载原书电子版**]之后写下的读书总结,原书大部分内容结合了经典书籍[算法导论](Introduction to Algorithms),内容更加细致深入,主要是介绍了各种常用的算法设计思想,以及如何使用Python高效巧妙地实现这些算法,这里有别于前面的数据结构篇,部分算法例如排序就不会详细介绍它的实现细节,而是侧重于它内在的算法思想。这部分使用了一些与数据结构有关的第三方模块,因为这篇的重点是算法的思想以及实现,所以并没有去重新实现每个数据结构,但是在介绍算法的同时会分析Python内置数据结构以及第三方数据结构模块的优缺点,也就意味着该篇比前面都要难不少,但是我想我的介绍应该还算简单明了,因为我用的都是比较朴实的语言,并没有像算法导论一样列出一堆性质和定理,主要是对着某个问题一步步思考然后算法就出来了,嘿嘿,除此之外,里面还有很多关于python开发的内容,精彩真的不容错过。 这里每篇文章都有实现代码,但是代码我一般都不会分析,更多地是分析算法思想,所以内容都比较多,即便如此也没有包括原书对应章节的所有内容,因为内容实在太丰富了,所以我只是选择经典的算法实例来介绍算法核心思想,除此之外,还有不少内容是原书没有的,部分是来自算法导论,部分是来自我自己的感悟,嘻嘻。该篇对于大神们来说是小菜,请一笑而过,对于菜鸟们来说可能有点难啃,所以最适合的是和我水平差不多的,对各个算法都有所了解但是理解还不算深刻的半桶水的程序猿,嘿嘿。 本篇的顺序按照原书[Python Algorithms: Mastering Basic Algorithms in the Python Language](Python Algorithms: Mastering Basic Algorithms in the Python Language)的章节来安排的(章节标题部分相同部分不同哟),为了节省时间以及保持原著的原滋原味,部分内容(一般是比较难以翻译和理解的内容)直接摘自原著英文内容。 **1.你也许觉得很多内容你都知道嘛,没有看的必要,其实如果是我的话我也会这么想,但是如果只是归纳一个算法有哪些步骤,那这个总结也就没有意义了,我觉得这个总结的亮点在于想办法说清楚一个算法是怎么想出来的,有哪些需要注意的,如何进行优化的等等,采用问答式的方式让读者和我一起来想出某个问题的解,每篇文章之后都还有一两道小题练手哟** **2.你也许还会说算法导论不是既权威又全面么,基本上每个算法都还有详细的证明呢,读算法导论岂不更好些,当然,你如果想读算法导论的话我不拦着你,读完了感觉自己整个人都不好了别怪小弟没有提醒你哟,嘻嘻嘻,左一个性质右一个定理实在不适合算法科普的啦,没有多少人能够坚持读完的。但是码农与蛇的故事内容不多哟,呵呵呵** **3.如果你细读本系列的话我保证你会有不少收获的,需要看算法导论哪个部分的地方我会给出提示的,嘿嘿。温馨提示,前面三节内容都是介绍基础知识,所以精彩内容从第4节开始哟,么么哒 O(∩_∩)O~** (1)[Python Algorithms - C1 Introduction](Python Algorithms) 本节主要是对原书中的内容做些简单介绍,说明算法的重要性以及各章节的内容概要。 (2)[Python Algorithms - C2 The basics](Python Algorithms) **本节主要介绍了三个内容:算法渐近运行时间的表示方法、六条算法性能评估的经验以及Python中树和图的实现方式。** (3)[Python Algorithms - C3 Counting 101](Python Algorithms) 原书主要介绍了一些基础数学,例如排列组合以及递归循环等,但是本节只重点介绍计算算法的运行时间的三种方法 (4)[Python Algorithms - C4 Induction and Recursion and Reduction](Python Algorithms) **本节主要介绍算法设计的三个核心知识:Induction(推导)、Recursion(递归)和Reduction(规约),这是原书的重点和难点部分** (5)[Python Algorithms - C5 Traversal](Python Algorithms) **本节主要介绍图的遍历算法BFS和DFS,以及对拓扑排序的另一种解法和寻找图的(强)连通分量的算法** (6)[Python Algorithms - C6 Divide and Combine and Conquer](Python Algorithms) **本节主要介绍分治法策略,提到了树形问题的平衡性以及基于分治策略的排序算法** (7)[Python Algorithms - C7 Greedy](Python Algorithms) **本节主要通过几个例子来介绍贪心策略,主要包括背包问题、哈夫曼编码和最小生成树等等** (8)[Python Algorithms - C8 Dynamic Programming](Python Algorithms) **本节主要结合一些经典的动规问题介绍动态规划的备忘录法和迭代法这两种实现方式,并对这两种方式进行对比** (9)[Python Algorithms - C9 Graphs](Python Algorithms) **本节主要介绍图算法中的各种最短路径算法,从不同的角度揭示它们的内核以及它们的异同**

一键天涯 2019-12-02 01:23:49 0 浏览量 回答数 0

回答

1.Python数据结构篇 数据结构篇主要是阅读[Problem Solving with Python](Welcome to Problem Solving with Algorithms and Data Structures) [该网址链接可能会比较慢]时写下的阅读记录,当然,也结合了部分[算法导论](Introduction to Algorithms)中的内容,此外还有不少wikipedia上的内容,所以内容比较多,可能有点杂乱。这部分主要是介绍了如何使用Python实现常用的一些数据结构,例如堆栈、队列、二叉树等等,也有Python内置的数据结构性能的分析,同时还包括了搜索和排序(在算法设计篇中会有更加详细的介绍)的简单总结。每篇文章都有实现代码,内容比较多,简单算法一般是大致介绍下思想及算法流程,复杂的算法会给出各种图示和代码实现详细介绍。 **这一部分是下面算法设计篇的前篇,如果数据结构还不错的可以直接看算法设计篇,遇到问题可以回来看数据结构篇中的某个具体内容充电一下,我个人认为直接读算法设计篇比较好,因为大家时间也都比较宝贵,如果你会来读这些文章说明你肯定有一定基础了,后面的算法设计篇中更多的是思想,这里更多的是代码而已,嘿嘿。** (1)[搜索](Python Data Structures) 简述顺序查找和二分查找,详述Hash查找(hash函数的设计以及如何避免冲突) (2)[排序](Python Data Structures) 简述各种排序算法的思想以及它的图示和实现 (3)[数据结构](Python Data Structures) 简述Python内置数据结构的性能分析和实现常用的数据结构:栈、队列和二叉堆 (4)[树总结](Python Data Structures) 简述二叉树,详述二叉搜索树和AVL树的思想和实现 2.Python算法设计篇 算法设计篇主要是阅读[Python Algorithms: Mastering Basic Algorithms in the Python Language](Python Algorithms: Mastering Basic Algorithms in the Python Language)[**点击链接可进入Springer免费下载原书电子版**]之后写下的读书总结,原书大部分内容结合了经典书籍[算法导论](Introduction to Algorithms),内容更加细致深入,主要是介绍了各种常用的算法设计思想,以及如何使用Python高效巧妙地实现这些算法,这里有别于前面的数据结构篇,部分算法例如排序就不会详细介绍它的实现细节,而是侧重于它内在的算法思想。这部分使用了一些与数据结构有关的第三方模块,因为这篇的重点是算法的思想以及实现,所以并没有去重新实现每个数据结构,但是在介绍算法的同时会分析Python内置数据结构以及第三方数据结构模块的优缺点,也就意味着该篇比前面都要难不少,但是我想我的介绍应该还算简单明了,因为我用的都是比较朴实的语言,并没有像算法导论一样列出一堆性质和定理,主要是对着某个问题一步步思考然后算法就出来了,嘿嘿,除此之外,里面还有很多关于python开发的内容,精彩真的不容错过。 这里每篇文章都有实现代码,但是代码我一般都不会分析,更多地是分析算法思想,所以内容都比较多,即便如此也没有包括原书对应章节的所有内容,因为内容实在太丰富了,所以我只是选择经典的算法实例来介绍算法核心思想,除此之外,还有不少内容是原书没有的,部分是来自算法导论,部分是来自我自己的感悟,嘻嘻。该篇对于大神们来说是小菜,请一笑而过,对于菜鸟们来说可能有点难啃,所以最适合的是和我水平差不多的,对各个算法都有所了解但是理解还不算深刻的半桶水的程序猿,嘿嘿。 本篇的顺序按照原书[Python Algorithms: Mastering Basic Algorithms in the Python Language](Python Algorithms: Mastering Basic Algorithms in the Python Language)的章节来安排的(章节标题部分相同部分不同哟),为了节省时间以及保持原著的原滋原味,部分内容(一般是比较难以翻译和理解的内容)直接摘自原著英文内容。 **1.你也许觉得很多内容你都知道嘛,没有看的必要,其实如果是我的话我也会这么想,但是如果只是归纳一个算法有哪些步骤,那这个总结也就没有意义了,我觉得这个总结的亮点在于想办法说清楚一个算法是怎么想出来的,有哪些需要注意的,如何进行优化的等等,采用问答式的方式让读者和我一起来想出某个问题的解,每篇文章之后都还有一两道小题练手哟** **2.你也许还会说算法导论不是既权威又全面么,基本上每个算法都还有详细的证明呢,读算法导论岂不更好些,当然,你如果想读算法导论的话我不拦着你,读完了感觉自己整个人都不好了别怪小弟没有提醒你哟,嘻嘻嘻,左一个性质右一个定理实在不适合算法科普的啦,没有多少人能够坚持读完的。但是码农与蛇的故事内容不多哟,呵呵呵** **3.如果你细读本系列的话我保证你会有不少收获的,需要看算法导论哪个部分的地方我会给出提示的,嘿嘿。温馨提示,前面三节内容都是介绍基础知识,所以精彩内容从第4节开始哟,么么哒 O(∩_∩)O~** (1)[Python Algorithms - C1 Introduction](Python Algorithms) 本节主要是对原书中的内容做些简单介绍,说明算法的重要性以及各章节的内容概要。 (2)[Python Algorithms - C2 The basics](Python Algorithms) **本节主要介绍了三个内容:算法渐近运行时间的表示方法、六条算法性能评估的经验以及Python中树和图的实现方式。** (3)[Python Algorithms - C3 Counting 101](Python Algorithms) 原书主要介绍了一些基础数学,例如排列组合以及递归循环等,但是本节只重点介绍计算算法的运行时间的三种方法 (4)[Python Algorithms - C4 Induction and Recursion and Reduction](Python Algorithms) **本节主要介绍算法设计的三个核心知识:Induction(推导)、Recursion(递归)和Reduction(规约),这是原书的重点和难点部分** (5)[Python Algorithms - C5 Traversal](Python Algorithms) **本节主要介绍图的遍历算法BFS和DFS,以及对拓扑排序的另一种解法和寻找图的(强)连通分量的算法** (6)[Python Algorithms - C6 Divide and Combine and Conquer](Python Algorithms) **本节主要介绍分治法策略,提到了树形问题的平衡性以及基于分治策略的排序算法** (7)[Python Algorithms - C7 Greedy](Python Algorithms) **本节主要通过几个例子来介绍贪心策略,主要包括背包问题、哈夫曼编码和最小生成树等等** (8)[Python Algorithms - C8 Dynamic Programming](Python Algorithms) **本节主要结合一些经典的动规问题介绍动态规划的备忘录法和迭代法这两种实现方式,并对这两种方式进行对比** (9)[Python Algorithms - C9 Graphs](Python Algorithms)

寒凝雪 2019-12-02 01:22:23 0 浏览量 回答数 0

回答

Python数据结构篇数据结构篇主要是阅读[Problem Solving with Python](Welcome to Problem Solving with Algorithms and Data Structures) [该网址链接可能会比较慢]时写下的阅读记录,当然,也结合了部分[算法导论](Introduction to Algorithms)中的内容,此外还有不少wikipedia上的内容,所以内容比较多,可能有点杂乱。这部分主要是介绍了如何使用Python实现常用的一些数据结构,例如堆栈、队列、二叉树等等,也有Python内置的数据结构性能的分析,同时还包括了搜索和排序(在算法设计篇中会有更加详细的介绍)的简单总结。每篇文章都有实现代码,内容比较多,简单算法一般是大致介绍下思想及算法流程,复杂的算法会给出各种图示和代码实现详细介绍。**这一部分是下面算法设计篇的前篇,如果数据结构还不错的可以直接看算法设计篇,遇到问题可以回来看数据结构篇中的某个具体内容充电一下,我个人认为直接读算法设计篇比较好,因为大家时间也都比较宝贵,如果你会来读这些文章说明你肯定有一定基础了,后面的算法设计篇中更多的是思想,这里更多的是代码而已,嘿嘿。**(1)[搜索](Python Data Structures) 简述顺序查找和二分查找,详述Hash查找(hash函数的设计以及如何避免冲突)(2)[排序](Python Data Structures) 简述各种排序算法的思想以及它的图示和实现(3)[数据结构](Python Data Structures) 简述Python内置数据结构的性能分析和实现常用的数据结构:栈、队列和二叉堆(4)[树总结](Python Data Structures) 简述二叉树,详述二叉搜索树和AVL树的思想和实现2.Python算法设计篇算法设计篇主要是阅读[Python Algorithms: Mastering Basic Algorithms in the Python Language](Python Algorithms: Mastering Basic Algorithms in the Python Language)[**点击链接可进入Springer免费下载原书电子版**]之后写下的读书总结,原书大部分内容结合了经典书籍[算法导论](Introduction to Algorithms),内容更加细致深入,主要是介绍了各种常用的算法设计思想,以及如何使用Python高效巧妙地实现这些算法,这里有别于前面的数据结构篇,部分算法例如排序就不会详细介绍它的实现细节,而是侧重于它内在的算法思想。这部分使用了一些与数据结构有关的第三方模块,因为这篇的重点是算法的思想以及实现,所以并没有去重新实现每个数据结构,但是在介绍算法的同时会分析Python内置数据结构以及第三方数据结构模块的优缺点,也就意味着该篇比前面都要难不少,但是我想我的介绍应该还算简单明了,因为我用的都是比较朴实的语言,并没有像算法导论一样列出一堆性质和定理,主要是对着某个问题一步步思考然后算法就出来了,嘿嘿,除此之外,里面还有很多关于python开发的内容,精彩真的不容错过。这里每篇文章都有实现代码,但是代码我一般都不会分析,更多地是分析算法思想,所以内容都比较多,即便如此也没有包括原书对应章节的所有内容,因为内容实在太丰富了,所以我只是选择经典的算法实例来介绍算法核心思想,除此之外,还有不少内容是原书没有的,部分是来自算法导论,部分是来自我自己的感悟,嘻嘻。该篇对于大神们来说是小菜,请一笑而过,对于菜鸟们来说可能有点难啃,所以最适合的是和我水平差不多的,对各个算法都有所了解但是理解还不算深刻的半桶水的程序猿,嘿嘿。本篇的顺序按照原书[Python Algorithms: Mastering Basic Algorithms in the Python Language](Python Algorithms: Mastering Basic Algorithms in the Python Language)的章节来安排的(章节标题部分相同部分不同哟),为了节省时间以及保持原著的原滋原味,部分内容(一般是比较难以翻译和理解的内容)直接摘自原著英文内容。 **1.你也许觉得很多内容你都知道嘛,没有看的必要,其实如果是我的话我也会这么想,但是如果只是归纳一个算法有哪些步骤,那这个总结也就没有意义了,我觉得这个总结的亮点在于想办法说清楚一个算法是怎么想出来的,有哪些需要注意的,如何进行优化的等等,采用问答式的方式让读者和我一起来想出某个问题的解,每篇文章之后都还有一两道小题练手哟****2.你也许还会说算法导论不是既权威又全面么,基本上每个算法都还有详细的证明呢,读算法导论岂不更好些,当然,你如果想读算法导论的话我不拦着你,读完了感觉自己整个人都不好了别怪小弟没有提醒你哟,嘻嘻嘻,左一个性质右一个定理实在不适合算法科普的啦,没有多少人能够坚持读完的。但是码农与蛇的故事内容不多哟,呵呵呵****3.如果你细读本系列的话我保证你会有不少收获的,需要看算法导论哪个部分的地方我会给出提示的,嘿嘿。温馨提示,前面三节内容都是介绍基础知识,所以精彩内容从第4节开始哟,么么哒 O(∩_∩)O~**(1)[Python Algorithms - C1 Introduction](Python Algorithms) 本节主要是对原书中的内容做些简单介绍,说明算法的重要性以及各章节的内容概要。(2)[Python Algorithms - C2 The basics](Python Algorithms) **本节主要介绍了三个内容:算法渐近运行时间的表示方法、六条算法性能评估的经验以及Python中树和图的实现方式。**(3)[Python Algorithms - C3 Counting 101](Python Algorithms) 原书主要介绍了一些基础数学,例如排列组合以及递归循环等,但是本节只重点介绍计算算法的运行时间的三种方法(4)[Python Algorithms - C4 Induction and Recursion and Reduction](Python Algorithms) **本节主要介绍算法设计的三个核心知识:Induction(推导)、Recursion(递归)和Reduction(规约),这是原书的重点和难点部分**(5)[Python Algorithms - C5 Traversal](Python Algorithms) **本节主要介绍图的遍历算法BFS和DFS,以及对拓扑排序的另一种解法和寻找图的(强)连通分量的算法**(6)[Python Algorithms - C6 Divide and Combine and Conquer](Python Algorithms) **本节主要介绍分治法策略,提到了树形问题的平衡性以及基于分治策略的排序算法**(7)[Python Algorithms - C7 Greedy](Python Algorithms) **本节主要通过几个例子来介绍贪心策略,主要包括背包问题、哈夫曼编码和最小生成树等等**(8)[Python Algorithms - C8 Dynamic Programming](Python Algorithms) **本节主要结合一些经典的动规问题介绍动态规划的备忘录法和迭代法这两种实现方式,并对这两种方式进行对比**(9)[Python Algorithms - C9 Graphs](Python Algorithms) /question/19889750/answer/27901020有哪些用 Python 语言讲算法和数据结构的书

琴瑟 2019-12-02 01:22:41 0 浏览量 回答数 0

问题

计算机、数学、运筹学等领域的32个重要算法 6月29日 【今日算法】

游客ih62co2qqq5ww 2020-06-29 13:46:10 13 浏览量 回答数 1

问题

【算法】五分钟算法小知识:动态规划设计:最长递增子序列

游客ih62co2qqq5ww 2020-05-11 07:22:50 26 浏览量 回答数 1

问题

算法工程师必知必会10大基础算法! 6月23日 【今日算法】

游客ih62co2qqq5ww 2020-06-23 13:36:00 6 浏览量 回答数 1

问题

【今日算法】4月20日-二分查找详解

游客ih62co2qqq5ww 2020-04-20 13:50:19 4 浏览量 回答数 1

回答

《数据结构与算法:C++》 作者: 窦延平 出版日期: 2005年05月第1版 主题词: 数据结构 算法分析 C语言-程序设计 分类:工业技术图书馆>自动化技术、计算机技术>计算技术、计算机技术>计算机软件>程序设计、软件工程>程序设计>数据结构 《数据结构与数据库技术》 作者: 孙志锋 出版日期: 2004年08月第1版 主题词: 数据结构-高等学校-教材 数据库系统-高等学校-教材 分类:工业技术图书馆>自动化技术、计算机技术>计算技术、计算机技术>计算机软件>程序设计、软件工程>总论及其他 图书简介:本书主要介绍数据结构与数据库二个部分,包括堆栈、队列、树、图等数据结构,排序查找等算法、数据库标准语言、理论、技术与设计等。 《数据结构》 作者: 徐孝凯编著 出版日期: 2004年01月 主题词: 数据结构-高等学校-教材 分类:工业技术图书馆>自动化技术、计算机技术>计算技术、计算机技术>计算机软件>程序设计、软件工程>总论及其他 《数据结构与算法解析》 作者: 苏仕华编著 出版日期: 2004年01月第1版 主题词: 数据结构-高等学校-教材 算法分析-高等学校-教材 分类:工业技术图书馆>自动化技术、计算机技术>计算技术、计算机技术>计算机软件>程序设计、软件工程>总论及其他 《数据结构自学辅导》 作者: 罗文劼 出版日期: 2002年 主题词: 数据结构 分类:工业技术图书馆>自动化技术、计算机技术>计算技术、计算机技术>计算机软件>程序设计、软件工程>总论及其他 图书简介:本书共分10章,归纳和总结了各章的重点和难点,给出了典型题分析,选解了每章中的习题,给出了重点题的解题思路、答案。 《算法与数据结构——C语言描述》 作者: 张乃孝主编 出版日期: 2002年09月第1版 主题词: 电子计算机-计算方法-数据结构 C语言-程序设计 分类:工业技术图书馆>自动化技术、计算机技术>计算技术、计算机技术>计算机软件>程序语言、算法语言>总论及其他 图书简介:本书系统地介绍了算法与数据结构方面的基本知识,内容包括线性表、字符串、栈与队列、树与二叉树、字典与检索、排序、算法分析与设计等。

云篆 2019-12-02 01:22:05 0 浏览量 回答数 0

回答

数据结构算法解析 高一凡著 清华大学出版社 数据结构及算法 彭波编著 机械工业出版社 数据结构与算法 廖明宏等编写 高等教育出版社 数据结构 C语言版 王晓东编著 电子工业出版社 数据结构 冯俊编著 清华大学出版社 数据结构 Java语言描述 (美)Michael Main著 机械工业出版社 数据结构与面向对象程序设计 C++版 (美) Michael Main, Walter Savitch著 清华大学出版社-------------------------《数据结构与算法:C++》 作者: 窦延平 出版日期: 2005年05月第1版 主题词: 数据结构 算法分析 C语言-程序设计 分类:工业技术图书馆>自动化技术、计算机技术>计算技术、计算机技术>计算机软件>程序设计、软件工程>程序设计>数据结构 《数据结构与数据库技术》 作者: 孙志锋 出版日期: 2004年08月第1版 主题词: 数据结构-高等学校-教材 数据库系统-高等学校-教材 分类:工业技术图书馆>自动化技术、计算机技术>计算技术、计算机技术>计算机软件>程序设计、软件工程>总论及其他 图书简介:本书主要介绍数据结构与数据库二个部分,包括堆栈、队列、树、图等数据结构,排序查找等算法、数据库标准语言、理论、技术与设计等。 《数据结构》 作者: 徐孝凯编著 出版日期: 2004年01月 主题词: 数据结构-高等学校-教材 分类:工业技术图书馆>自动化技术、计算机技术>计算技术、计算机技术>计算机软件>程序设计、软件工程>总论及其他 《数据结构与算法解析》 作者: 苏仕华编著 出版日期: 2004年01月第1版 主题词: 数据结构-高等学校-教材 算法分析-高等学校-教材 分类:工业技术图书馆>自动化技术、计算机技术>计算技术、计算机技术>计算机软件>程序设计、软件工程>总论及其他 《数据结构自学辅导》 作者: 罗文劼 出版日期: 2002年 主题词: 数据结构 分类:工业技术图书馆>自动化技术、计算机技术>计算技术、计算机技术>计算机软件>程序设计、软件工程>总论及其他 图书简介:本书共分10章,归纳和总结了各章的重点和难点,给出了典型题分析,选解了每章中的习题,给出了重点题的解题思路、答案。 《算法与数据结构——C语言描述》 作者: 张乃孝主编 出版日期: 2002年09月第1版 主题词: 电子计算机-计算方法-数据结构 C语言-程序设计 分类:工业技术图书馆>自动化技术、计算机技术>计算技术、计算机技术>计算机软件>程序语言、算法语言>总论及其他 图书简介:本书系统地介绍了算法与数据结构方面的基本知识,内容包括线性表、字符串、栈与队列、树与二叉树、字典与检索、排序、算法分析与设计等。

管理贝贝 2019-12-02 01:22:05 0 浏览量 回答数 0

回答

1.选择排序 定义:首先,选出数组中最小的元素,将它与数组中第一个元素交换。然后找出次小的元素,并将它与数组中第二个元素交换。按照这种方法一直进行下去,直到整个数组排完序。 交换次数:N-1 缺点:运行时间对文件已有序的部分依赖较少,从文件中选出最小元素的每一遍操作过程,并没有给出下一遍要找的最小元素的位置的相关消息。例如,该程序对已排好序的文件或各元素都相同的元素文件与对随机排列的文件排序所花的时间基本相同。 适用性:对于元素比较大,关键字又比较小的文件,应该选择该方法,而其他算法移动数据的步数都比选择排序更多。 sc(source code): template <typename T, typename Compare> void SelectSort(vector<T> & arr, Compare cp) { Display(arr, "before SelectSort:"); for (size_t i=0; i<arr.size(); ++i) { size_t m = i; for (size_t j=i+1; j<arr.size(); ++j) { if ( !cp(arr[m], arr[j]) ) { m = j; } } if (m != i) { swap(arr[i], arr[m]); } Display(arr, i); } } 2.插入排序(摘自: 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 算法描述: 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 将新元素插入到该位置中 重复步骤2 如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找排序。 算法复杂度: 如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数减去(n-1)次。平均来说插入排序算法复杂度为O(n2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。 sc: template <typename T, typename Compare> void InsertSort(vector<T>& arr, Compare cp) { Display(arr, "before InsertSort:"); for(size_t i=1; i<arr.size(); ++i) { T temp = arr[i]; for(size_t j=i ; j>0 && !cp(temp, arr[j-1]) ; --j) { arr[j] = arr[j-1]; arr[j-1] = temp; Display(arr, "----"); } Display(arr, i); } }

小旋风柴进 2019-12-02 01:18:47 0 浏览量 回答数 0

回答

把这个文件处理成一个用字典树(trie)或者B树存储的结构,然后就可以快速查询了。前面说得可能太抽象,给你一个容易实现的算法吧。效率虽然比trie/b-tree略低,但是也很够用。预处理遍历这个文件,记录每行的offset记录下来,作为int的数组。对这个数组进行间接排序。注意,所谓间接,指的是排序时比较的是这个数组元素指向的行。将这个数组保存起来(17w个int,也就不到700KB,随便什么地方保存)。查询读取这个数组。使用"间接"二分查找。注意,查找时比较的是对应行的前n个字符,n == strlen(a)。

落地花开啦 2019-12-02 02:44:43 0 浏览量 回答数 0

问题

【算法】五分钟算法小知识:双指针技巧总结

游客ih62co2qqq5ww 2020-05-08 14:25:40 19 浏览量 回答数 1

回答

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 [编辑本段]基本概念 * 若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个思想建立的表为散列表。 * 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象” 作为记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。 * 若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。 [编辑本段]常用的构造散列函数的方法 散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位ǐ 1. 直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a•key + b,其中a和b为常数(这种散列函数叫做自身函数) 2. 数字分析法 3. 平方取中法 4. 折叠法 5. 随机数法 6. 除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即 H(key) = key MOD p, p<=m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。 [编辑本段]处理冲突的方法 1. 开放寻址法:Hi=(H(key) + di) MOD m, i=1,2,…, k(k<=m-1),其中H(key)为散列函数,m为散列表长,di为增量序列,可有下列三种取法: 1. di=1,2,3,…, m-1,称线性探测再散列; 2. di=1^2, (-1)^2, 2^2,(-2)^2, (3)^2, …, ±(k)^2,(k<=m/2)称二次探测再散列; 3. di=伪随机数序列,称伪随机探测再散列。 == 2. 再散列法:Hi=RHi(key), i=1,2,…,k RHi均是不同的散列函数,即在同义词产生地址冲突时计算另一个散列函数地址,直到冲突不再发生,这种方法不易产生“聚集”,但增加了计算时间。 3. 链地址法(拉链法) 4. 建立一个公共溢出区 [编辑本段]查找的性能分析 散列表的查找过程基本上和造表过程相同。一些关键码可通过散列函数转换的地址直接找到,另一些关键码在散列函数得到的地址上产生了冲突,需要按处理冲突的方法进行查找。在介绍的三种处理冲突的方法中,产生冲突后的查找仍然是给定值与关键码进行比较的过程。所以,对散列表查找效率的量度,依然用平均查找长度来衡量。 查找过程中,关键码的比较次数,取决于产生冲突的多少,产生的冲突少,查找效率就高,产生的冲突多,查找效率就低。因此,影响产生冲突多少的因素,也就是影响查找效率的因素。影响产生冲突多少有以下三个因素: 1. 散列函数是否均匀; 2. 处理冲突的方法; 3. 散列表的装填因子。 散列表的装填因子定义为:α= 填入表中的元素个数 / 散列表的长度 α是散列表装满程度的标志因子。由于表长是定值,α与“填入表中的元素个数”成正比,所以,α越大,填入表中的元素较多,产生冲突的可能性就越大;α越小,填入表中的元素较少,产生冲突的可能性就越小。 实际上,散列表的平均查找长度是装填因子α的函数,只是不同处理冲突的方法有不同的函数。 了解了hash基本定义,就不能不提到一些著名的hash算法,MD5 和 SHA-1 可以说是目前应用最广泛的Hash算法,而它们都是以 MD4 为基础设计的。那么他们都是什么意思呢? 这里简单说一下: (1) MD4 MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message Digest 的缩写。它适用在32位字长的处理器上用高速软件实现--它是基于 32 位操作数的位操作来实现的。 (2) MD5 MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好 (3) SHA-1 及其他 SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。 那么这些Hash算法到底有什么用呢? Hash算法在信息安全方面的应用主要体现在以下的3个方面: (1) 文件校验 我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。 MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。 (2) 数字签名 Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。 对 Hash 值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。 (3) 鉴权协议 如下的鉴权协议又被称作挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。 MD5、SHA1的破解 2004年8月17日,在美国加州圣芭芭拉召开的国际密码大会上,山东大学王小云教授在国际会议上首次宣布了她及她的研究小组近年来的研究成果——对MD5、HAVAL-128、MD4和RIPEMD等四个著名密码算法的破译结果。 次年二月宣布破解SHA-1密码。 [编辑本段]实际应用 以上就是一些关于hash以及其相关的一些基本预备知识。那么在emule里面他具体起到什么作用呢? 大家都知道emule是基于P2P (Peer-to-peer的缩写,指的是点对点的意思的软件), 它采用了"多源文件传输协议”(MFTP,the Multisource FileTransfer Protocol)。在协议中,定义了一系列传输、压缩和打包还有积分的标准,emule 对于每个文件都有md5-hash的算法设置,这使得该文件独一无二,并且在整个网络上都可以追踪得到。 什么是文件的hash值呢? MD5-Hash-文件的数字文摘通过Hash函数计算得到。不管文件长度如何,它的Hash函数计算结果是一个固定长度的数字。与加密算法不同,这一个Hash算法是一个不可逆的单向函数。采用安全性高的Hash算法,如MD5、SHA时,两个不同的文件几乎不可能得到相同的Hash结果。因此,一旦文件被修改,就可检测出来。 当我们的文件放到emule里面进行共享发布的时候,emule会根据hash算法自动生成这个文件的hash值,他就是这个文件唯一的身份标志,它包含了这个文件的基本信息,然后把它提交到所连接的服务器。当有他人想对这个文件提出下载请求的时候, 这个hash值可以让他人知道他正在下载的文件是不是就是他所想要的。尤其是在文件的其他属性被更改之后(如名称等)这个值就更显得重要。而且服务器还提供了,这个文件当前所在的用户的地址,端口等信息,这样emule就知道到哪里去下载了。 一般来讲我们要搜索一个文件,emule在得到了这个信息后,会向被添加的服务器发出请求,要求得到有相同hash值的文件。而服务器则返回持有这个文件的用户信息。这样我们的客户端就可以直接的和拥有那个文件的用户沟通,看看是不是可以从他那里下载所需的文件。 对于emule中文件的hash值是固定的,也是唯一的,它就相当于这个文件的信息摘要,无论这个文件在谁的机器上,他的hash值都是不变的,无论过了多长时间,这个值始终如一,当我们在进行文件的下载上传过程中,emule都是通过这个值来确定文件。 那么什么是userhash呢? 道理同上,当我们在第一次使用emule的时候,emule会自动生成一个值,这个值也是唯一的,它是我们在emule世界里面的标志,只要你不卸载,不删除config,你的userhash值也就永远不变,积分制度就是通过这个值在起作用,emule里面的积分保存,身份识别,都是使用这个值,而和你的id和你的用户名无关,你随便怎么改这些东西,你的userhash值都是不变的,这也充分保证了公平性。其实他也是一个信息摘要,只不过保存的不是文件信息,而是我们每个人的信息。 那么什么是hash文件呢? 我们经常在emule日志里面看到,emule正在hash文件,这里就是利用了hash算法的文件校验性这个功能了,文章前面已经说了一些这些功能,其实这部分是一个非常复杂的过程,目前在ftp,bt等软件里面都是用的这个基本原理,emule里面是采用文件分块传输,这样传输的每一块都要进行对比校验,如果错误则要进行重新下载,这期间这些相关信息写入met文件,直到整个任务完成,这个时候part文件进行重新命名,然后使用move命令,把它传送到incoming文件里面,然后met文件自动删除,所以我们有的时候会遇到hash文件失败,就是指的是met里面的信息出了错误不能够和part文件匹配,另外有的时候开机也要疯狂hash,有两种情况一种是你在第一次使用,这个时候要hash提取所有文件信息,还有一种情况就是上一次你非法关机,那么这个时候就是要进行排错校验了。 关于hash的算法研究,一直是信息科学里面的一个前沿,尤其在网络技术普及的今天,他的重要性越来越突出,其实我们每天在网上进行的信息交流安全验证,我们在使用的操作系统密钥原理,里面都有它的身影,特别对于那些研究信息安全有兴趣的朋友,这更是一个打开信息世界的钥匙,他在hack世界里面也是一个研究的焦点。 一般的线性表、树中,记录在结构中的相对位置是随机的即和记录的关键字之间不存在确定的关系,在结构中查找记录时需进行一系列和关键字的比较。这一类查找方法建立在“比较”的基础上,查找的效率与比较次数密切相关。理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。因而查找时,只需根据这个对应关系f找到给定值K的像f(K)。若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上,由此不需要进行比较便可直接取得所查记录。在此,称这个对应关系f为哈希函数,按这个思想建立的表为哈希表(又称为杂凑法或散列表)。 哈希表不可避免冲突(collision)现象:对不同的关键字可能得到同一哈希地址 即key1≠key2,而hash(key1)=hash(key2)。具有相同函数值的关键字对该哈希函数来说称为同义词(synonym)。 因此,在建造哈希表时不仅要设定一个好的哈希函数,而且要设定一种处理冲突的方法。可如下描述哈希表:根据设定的哈希函数H(key)和所选中的处理冲突的方法,将一组关键字映象到一个有限的、地址连续的地址集(区间)上并以关键字在地址集中的“象”作为相应记录在表中的存储位置,这种表被称为哈希表。 对于动态查找表而言,1) 表长不确定;2)在设计查找表时,只知道关键字所属范围,而不知道确切的关键字。因此,一般情况需建立一个函数关系,以f(key)作为关键字为key的录在表中的位置,通常称这个函数f(key)为哈希函数。(注意:这个函数并不一定是数学函数) 哈希函数是一个映象,即:将关键字的集合映射到某个地址集合上,它的设置很灵活,只要这个地址集合的大小不超出允许范围即可。 现实中哈希函数是需要构造的,并且构造的好才能使用的好。 用途:加密,解决冲突问题。。。。 用途很广,比特精灵中就使用了哈希函数,你可 以自己看看。 具体可以学习一下数据结构和算法的书。 [编辑本段]字符串哈希函数 (著名的ELFhash算法) int ELFhash(char *key) return h%MOD; }

晚来风急 2019-12-02 01:22:24 0 浏览量 回答数 0

回答

基础类 常见十大算法 优劣术语稳定性 原本a在b前,a=b,排序之后位置任然不变。不稳定性则相反内排序 所有排序都在内存中完成。外排序数据放磁盘,排序通过磁盘内存的数据传输事件复杂度 算法执行耗费的时间 空间复杂度 算法执行耗费的内存 In/out-place: 不占/占额外内存 冒泡排序: 选择排序: 插入排序: 希尔排序: 归并排序: 快速排序: 堆排序: 计数排序: 桶排序: 基数排序: 提高类 常见算法面试题 Problem 1 : Is it a loop ? (判断链表是否有环?) Assume that wehave a head pointer to alink-list. Also assumethat we know the list is single-linked. Can you come upan algorithm to checkwhether this link list includes a loop by using O(n) timeand O(1) space wheren is the length of the list? Furthermore, can you do sowith O(n) time and onlyone register? 方法:使用两个指针,从头开始,一个一次前进一个节点,一个前进2个节点,则最多2N,后两个指针可以重合;如果无环,则正常停止。 同样的,可以找到链表的中间节点。同上。 Problem 2:设计一个复杂度为n的算法找到链表倒数第m个元素。最后一个元素假定是倒数第0个。 提示:双指针查找 Problem 3:用最简单的方法判断一个LONG整形的数A是2^n(2的n次方) 提示:x&(x-1) Problem 4:两个烧杯,一个放糖一个放盐,用勺子舀一勺糖到盐,搅拌均匀,然后舀一勺混合物会放糖的烧杯,问你两个烧杯哪个杂质多? 提示:相同。假设杂质不等,那么将杂质放回原杯中,则杯中物体重量必变化,不合理。 Problem 5:给你a、b两个文件,各存放50亿条url,每条url各占用64字节,内存限制是4G,让你找出a、b文件共同的url。 法1:使用hash表。使用a中元素创建hash表,hash控制在适当规模。在hash中查找b的元素,找不到的url先存在新文件中,下次查找。如果找到,则将相应的hash表项删除,当hash表项少于某个阈值时,将a中新元素重新hash。再次循环。 法2:对于hash表项增加一项记录属于的文件a,b。只要不存在的表项即放入hash表中,一致的项则删除。注意:可能存在很多重复项,引起插入,删除频繁。 Problem 6:给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少个兄弟单词。 提示:将每个的单词按照字母排序,则兄弟单词拥有一致的字母排序(作为单词签名)。使用单词签名来查找兄弟单词。 Problem 7:五桶球,一桶不正常,不知道球的重量和轻重关系,用天平称一次找出那桶不正常的球。 Problem 8:给两个烧杯,容积分别是m和n升(m!=n),还有用不完的水,用这两个烧杯能量出什么容积的水? m, n, m+n, m-n以及线性叠加的组合 Problem 9:写出一个算法,对给定的n个数的序列,返回序列中的最大和最小的数。 Problem 10:你能设计出一个算法,只需要执行1.5n次比较就能找到序列中最大和最小的数吗?能否再少? 提示:先通过两两比较,区分大小放入“大”,“小”两个数组中。从而最大数在“大”数组中,最小数在“小”数组中。 Problem 11:给你一个由n-1个整数组成的未排序的序列,其元素都是1到n中的不同的整数。请写出一个寻找序列中缺失整数的线性-时间算法。 提示:累加求和 Problem 12:void strton(constchar* src, const char*token) 假设src是一长串字符,token存有若干分隔符,只要src的字符是token中的任何一个,就进行分割,最终将src按照token分割成若干单词。找出一种O(n)算法? 提示:查表的方法,将所有的字符串存储在长度为128的数组中,并将作为分隔符的字符位置1,这样即可用常数时间判断字符是否为分隔符,通过n次扫描,将src分割成单词。 Problem 13:一个排好序的数组A,长度为n,现在将数组A从位置m(m<n,m未知)分开,并将两部分互换位置,假设新数组记为B,找到时间复杂度为O(lgn)的算法查找给定的数x是否存在数组B中? 提示:同样采用二分查找。核心思想就是确定所查找数所在的范围。通过比较3个数(头,尾,中间)和所查找数之间的关系,可以确定下次查找的范围。 Problem 14:一个排好序的数组A,长度为n,现在将数组A从位置m(m<n,m已知)分开,并将两部分互换位置,设计一个O(n)的算法实现这样的倒置,只允许使用一个额外空间。(循环移位的效率不高) 提示:(A’B’)’ =BA Problem 15:给出Vector的一个更好实现。(STL的vector内存的倍增的,但是每次倍增需要拷贝已存元素,平均每个元素需要拷贝一次,效率不高) 提示:可使用2^n的固定长度作为每次分配的最小单位,并有序的记录每个块的首地址。这中结构同样可以实现线性查找,并且拷贝代价很低(仅有指针) Problem 16:给出已排序数组A,B,长度分别为n,m,请找出一个时间复杂度为(lgn)的算法,找到排在第k位置的数。 提示:二分查找。 Problem 17:给出任意数组A,B,长度分别为n,m,请找出一个时间复杂度为(lgn)的算法,找到排在第k位置的数。 提示:通过最小堆记录k个数,不断更新,扫描一次完毕。 这个提示有问题,求最优算法! Problem 18:假设数组A有n个元素,元素取值范围是1~n,判定数组是否存在重复元素?要求复杂度为O(n)。 法1:使用n的数组,记录元素,存在记为1,两次出现1,即重复。 法2:使用m的数组,分别记录大小:n/m, 2n/m …..的元素个数。桶方法 法3:累加求和。可用于求仅有一个元素重复的方法。 Problem 19:给定排好序的数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X。给出一个O(n)的算法。 提示:从中间向两边查找。利用有序的条件 Problem 20:给定排好序的数组A,大小为n,请给出一个O(n)的算法,删除重复元素,且不能使用额外空间。 提示,既然有重复,必有冗余空间。将元素放入数组的前面,并记录下次可放位置,不断向后扫描即可。 Problem 21:给定两个排好序的数组A,B,大小分别为n,m。给出一个高效算法查找A中的哪些元素存在B数组中。 注意:一般在大数组中执行二分查找,将小数组的元素作为需查找的对象。 更优算法(轩辕刃提供):可以使用两个指针遍历AB,比较当前大小就可以了...时间复杂度o(n+m) Problem 22:问:有1000桶酒,其中1桶有毒。而一旦吃了,毒性会在1周后发作。现在我们用小老鼠做实验,要在1周内找出那桶毒酒,问最少需要多少老鼠。 答案:10只。将酒编号为1~1000 将老鼠分别编号为1 2 4 8 16 32 64 128 256 512 喂酒时 让酒的编号等于老鼠编号的加和如:17号酒喂给1号和16号老鼠 76号酒喂给4号、8号和64号老鼠 七天后将死掉的老鼠编号加起来 得到的编号就是有毒的那桶酒 因为2的10次方等于1024 所以10只老鼠最多可以测1024桶酒 证明如下:使用二进制表示:01, 10, 100, 1000,… , 1,000,000,000。对于任何一个小于1024的数,均可以采用前面的唯一一组二进制数来表示。故成立。 Problem 23:设计一组最少个数砝码,使得天平能够称量1~1000的重量。 如果砝码只能放单边,1,2 ,4 , 512最好。(只能单加) 如果允许砝码双边放,1, 3, 9, 27…. 最好。(可加可减)已知1,3,如何计算下一个数。现可称重量1,2,3,4。设下个数为x,可称重量为, x-4, x-3, x-2, x-1, x, x+1,x+2, x+3, x+4。为使砝码最好,所称重量应该不重复(浪费)。故x=9。同理,可得后面。 图形算法题 Problem 24:如何判断一个点是否在一个多边形内? 提示:对多边形进行分割,成为一个个三角形,判断点是否在三角形内。 一个非常有用的解析几何结论:如果P2(x1,y1),P2(x2,y2),P3(x3,y3)是平面上的3个点,那么三角形P1P2P3的面积等于下面绝对值的二分之一: | x1 y1 1 | | x2 y2 1 | = x1y2 + x3y1 + x2y3 –x3y2 – x2y1 – x1y3 | x3 y3 1 | 当且仅当点P3位于直线P1P2(有向直线P1->P2)的右侧时,该表达式的符号为正。这个公式可以在固定的时间内,检查一个点位于两点确定直线的哪侧,以及点到直线的距离(面积=底*高/2)。 这个结论:可以用来判断点是否在点是否在三角形内。法1:判断点和三角形三边所行程的3个三角形的面积之和是否等于原来三角形的面积。(用了三次上面的公式)。 法2:判断是否都在三条边的同一边,相同则满足,否则不在三角形内。 Problem 25:给出两个n为向量与0点形成角的角平分线。 提示:对两条边进行归一化,得到长度为1的两点,取两个的中点即可。 实战类型 1,确定函数名字与原型 2,严进宽出 3,边界考虑 4,出错处理 5,性能优化(时间复杂度,空间复杂度) 6,循环的掌握 7,递归的应用 8,2个指针跑步 9, Hash算法

happycc 2019-12-02 02:11:37 0 浏览量 回答数 0

问题

eclipse运行参数如何使用重定向符

爵霸 2019-12-01 19:44:49 1068 浏览量 回答数 1

问题

【精品问答】Python3 实例80问(附源码解析)

珍宝珠 2020-02-17 13:11:47 1931 浏览量 回答数 3

问题

经典动态规划:高楼扔鸡蛋 6月2日 【今日算法】

游客ih62co2qqq5ww 2020-06-02 16:06:52 3 浏览量 回答数 1

问题

经典动态规划:高楼扔鸡蛋(进阶篇) 6月3日【今日算法】

游客ih62co2qqq5ww 2020-06-03 15:10:38 7 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板