
● 结构算法
武哥聊编程
同济大学硕士,第一批华为5G研发人员,拼多多广告投放部门,全网20w+粉丝。微信公众号:武哥聊编程
展开
-
【数据结构和算法10】 带权图
上一节我们已经看到了图的边可以有方向,这一节里,我们将探讨边的另一个特性:权值。例如,如果带权图的顶点代表城市,边的权可能代表城市之间的距离,或者城市之间的路费,或者之间的车流量等等。 带权图归根究底还是图,上一节那些图的基本操作,例如广度优先搜索和深度优先搜索等都是一样的,在这一节里,我们主要来探讨一下带权图的最小生成树最短路径问题。小生成树 首先探讨下最小生成树问题...原创 2016-04-13 15:41:51 · 13293 阅读 · 6 评论 -
【数据结构和算法16】堆排序
堆排序,顾名思义就是利用堆这个数据结构对数据项进行排序,前面提到过,堆数据结构中,节点大于或等于自己的子节点。那么我们可以将待排序的数据项依次添加到堆中,然后再依次取出根节点即可。从堆中取出的数据项是从大到小排列的。因为根节点永远是最大的,而堆中永远是取根节点。如果对堆这种数据结构不太了解的话,可以先看这篇博文:数据结构和算法之 堆,这里不再赘述。下面我们来看看堆排序的实现(如...原创 2016-04-19 19:54:21 · 4017 阅读 · 3 评论 -
【数据结构和算法14】归并排序
归并算法的中心是归并两个已经有序的数组。归并两个有序数组A和B,就生成了第三个数组C,数组C包含数组A和B的所有数据项,并且使它们有序的排列在数组C中。首先我们来看看归并的过程,然后看它是如何在排序中使用的。 假设有两个有序数组,不要求有相同的大小。设数组A有4个数据项,数组B有6个数据项,它们要被归并到数组C中,开始时数组C有10个存储空间,归并过程如下图所示:...原创 2016-04-19 19:17:42 · 6504 阅读 · 4 评论 -
【数据结构和算法13】快速排序
上一节我们学习了一个高级排序算法:希尔排序,这一节我们将讨论另一个高级排序算法:快速排序。 快速排序算法是最流行的排序算法,因为有充足的理由,在大多数情况下,快速排序都是最快的,执行时间为O(NlogN)级(这只是对内部排序或者说随机存储器内的排序而言,对于在磁盘文件中的数据进行的排序,其他的排序算法可能更好)。快速排序本质上通过一个数组划分为两个子数组,然...原创 2016-04-16 21:00:12 · 5012 阅读 · 2 评论 -
【数据结构和算法12】希尔排序
上一章我们学习了冒泡排序、选择排序和插入排序三种基础排序算法,这三种排序算法比较简单,时间复杂度均为O(N2),效率不高。这节我们讨论一个高级排序算法:希尔排序。希尔排序是基于插入排序的,插入排序有个弊端,假设一个很小的数据项在很靠近右端的位置上,那么所有的中间数据项都必须向右移动一位,这个步骤对每一个数据项都执行了将近N次的复制,这也是插入排序效率为O(N2)的原因。...原创 2016-04-16 16:31:43 · 9901 阅读 · 3 评论 -
【数据结构和算法15】二叉树排序
顾名思义,二叉树排序就是利用二叉搜索树的特点进行排序,前面提到过二叉搜索树的特点是,左子节点比自己小,右子节点比自己大,那么二叉树排序的思想就是先将待排序序列逐个添加到二叉搜索树中去,再通过中序遍历二叉搜索树就可以将数据从小到大取出来。如果对二叉树还不太了解,请看这篇博文:二叉搜索树 ,这里不再赘述。下面我们来看看二叉树排序的实现:public class Tree...原创 2016-04-19 19:38:35 · 6441 阅读 · 2 评论 -
常用数据结构和算法操作效率的对比总结
欢迎关注我新搭建的博客:[http://www.itcodai.com/](http://www.itcodai.com/) 前面介绍了经典的数据结构和算法,这一节我们对这些数据结构和算法做一个总结,具体细节,请参见各个章节的详细介绍,这里我们用表格来呈现它们的效率。1.数据结构部分数据结构中常用的操作的效率表 通用数据结构 ...原创 2016-07-19 07:59:07 · 16134 阅读 · 8 评论 -
【数据结构和算法11】基础排序
前10节我们学习了一些经典的数据结构,从这节开始,我们将学习一些排序算法。这一节我们先学习几个基础排序算法:冒泡排序,选择排序和插入排序。1.冒泡排序 冒泡排序算法运行起来非常慢,但在概念上它是排序算法中最简单的,因此冒泡排序算法在刚开始研究排序技术时是一个非常好的算法。冒泡排序算法的基本流程是:每一轮从头开始两两比较,将较大的项放在较小项的右边,这样每轮下来保...原创 2016-04-14 22:02:43 · 5745 阅读 · 2 评论 -
【数据结构和算法05】 红-黑树(看完包懂~)
(友情提示,红-黑树是基于二叉搜索树的,如果对二叉搜索树不了解,可以先看看:二叉搜索树 ) 二叉搜索树是个很好的数据结构,可以快速地找到一个给定关键字的数据项,并且可以快速地插入和删除数据项。但是二叉搜索树有个很麻烦的问题,如果树中插入的是随机数据,则执行效果很好,但如果插入的是有序或者逆序的数据,那么二叉搜索树的执行速度就变得很慢。因为当插入数值有序时,二叉树就是非平衡的...原创 2016-04-13 15:50:25 · 75072 阅读 · 107 评论 -
【数据结构和算法17】拓扑排序
这一节我们学习一个新的排序算法,准确的来说,应该叫“有向图的拓扑排序”。所谓有向图,就是A->B,但是B不能到A。与无向图的区别是,它的边在邻接矩阵里只有一项(友情提示:如果对图这种数据结构部不太了解的话,可以先看一下这篇博文:数据结构和算法之 无向图。因为拓扑排序是基于图这种数据结构的)。有向图的邻接矩阵如下表所示: A ...原创 2016-04-20 12:17:53 · 9206 阅读 · 2 评论 -
【数据结构与算法08】 堆
优先级队列可以用有序数组来实现,这种做法的问题是,尽管删除最大数据项的时间复杂度为O(1),但是插入还是需要较长的O(N)时间,这是因为必须移动数组中平均一半的数据项以插入新数据项,并在完成插入后,数组依然有序。 这里介绍实现优先级队列的另一种结构:堆。堆是一种树,并非java和C++等编译语言里的“堆”。由它实现的优先级队列的插入和删除的时间复杂度都是O(log...原创 2016-04-09 16:41:05 · 5064 阅读 · 3 评论 -
【数据结构与算法09】图
在计算机程序设计中,图是最常用的结构之一。图是一种与树有些相像的数据结构,实际上,从数学意义上说,树是图的一种。然而在计算机程序设计中,图的应用方式与树不同。 前面讨论的数据结构都有一个框架,这个框架都是由相应的算法设定的。比如说,二叉树是那样一个形状,就是因为那样的形状使它更容易搜索数据和插入新数据,树的边表示了从一个节点到另一个节点的快捷方式。而图通常有一个固...原创 2016-04-10 16:03:54 · 4179 阅读 · 12 评论 -
【数据结构与算法01】数组
数组是应用最广泛的数据存储结构。它被植入到大部分的编程语言中,由于数组十分易懂,所以在这里就不赘述,主要附上两端代码,一个是普通的数组,另一个是有序数组。有序数组是按关键字升序(或降序)排列的,这种排列使快速查找数据项成为可能,即可以使用二分查找。 普通数组的java代码:public class GeneralArray { private int[] a; priv...原创 2016-04-11 22:04:10 · 7580 阅读 · 16 评论 -
【数据结构与算法02】栈与队列
我们知道,在数组中,若知道数据项的下标,便可立即访问该数据项,或者通过顺序搜索数据项,访问到数组中的各个数据项。但是栈和队列不同,它们的访问是受限制的,即在特定时刻只有一个数据项可以被读取或者被删除。众所周知,栈是先进后出,只能访问栈顶的数据,队列是先进先出,只能访问头部数据。这里不再赘述。 栈的主要机制可以用数组来实现,也可以用链表来实现,下面用数组来实现栈的基本操作:p...原创 2016-04-11 22:49:30 · 7393 阅读 · 7 评论 -
【数据结构和算法03】链表
在第一章的数组中,我们看到数组作为数据存储结构有一定的缺陷。在无序数组中,搜索时低效的;而在有序数组中,插入效率又很低;不管在哪一种数组中删除效率都很低。况且一个数组创建后,它的大小是无法改变的。 在本章中,我们将讨论下链表这个数据结构,它可以解决上面的一些问题。链表可能是继数组之后第二种使用得最广泛的通用数据结构了。本章主要讨论单链表和双向链表。...原创 2016-04-12 20:29:44 · 5351 阅读 · 5 评论 -
【数据结构与算法07】哈希表
哈希表也称为散列表,是根据关键字值(key value)而直接进行访问的数据结构。也就是说,它通过把关键字值映射到一个位置来访问记录,以加快查找的速度。这个映射函数称为哈希函数(也称为散列函数),映射过程称为哈希化,存放记录的数组叫做散列表。比如我们可以用下面的方法将关键字映射成数组的下标:arrayIndex = hugeNumber % arraySize。 ...原创 2016-04-12 23:59:05 · 8767 阅读 · 11 评论 -
【数据结构与算法04】二叉树
在有序数组中,可以快速找到特定的值,但是想在有序数组中插入一个新的数据项,就必须首先找出新数据项插入的位置,然后将比新数据项大的数据项向后移动一位,来给新的数据项腾出空间,删除同理,这样移动很费时。显而易见,如果要做很多的插入和删除操作和删除操作,就不该选用有序数组。 另一方面,链表中可以快速添加和删除某个数据项,但是在链表中查找数据项可不容易,必须从头开始访问链表...原创 2016-04-13 00:20:27 · 22372 阅读 · 30 评论 -
【程序员面试金典】数组与字符串
今天开始看《程序员面试金典》这本书,这本书里面的算法题还是挺好的,能学到很多新的思想,解决问题的方式。我会针对里面的内容,总结下算法题的解题方法和代码的实现,有些题我会加上自己的思考,提供不止一种解法以飨读者。大家如果有新的解题方法或者新的想法,欢迎给我留言,互相交流,共同进步! 下面先看看第一部分,数组和字符串中的算法题:1.问题一实现一个...原创 2016-04-17 17:55:05 · 4134 阅读 · 5 评论 -
算法应该怎么“玩”
市面上关于算法的书可谓琳琅满目,有经典但难啃的、也有简单入门的、更有独辟蹊径的,不过这些大多数都是偏理论的多、偏应用的少,很多读者啃完后,对各种排序、搜索、遍历等常用算法了如指掌,但是遇到实际问题时还是束手无策,这其实就是经验和方法集的问题了。本课程将带着大家“玩”算法,其实就是希望大家能做到以下三点:对于遇到特殊问题时要能够自己设计出算法实现;对于原理公开的知名算法,要能将算法原理翻译成...原创 2018-08-16 13:06:57 · 5656 阅读 · 1 评论