随笔 - 410
文章 - 0
评论 - 519
阅读 -
147万
随笔分类 - 数据结构和算法
数据结构和算法系列17 图
摘要:这一篇我们要总结的是图(Graph),图可能比我们之前学习的线性结构和树形结构都要复杂,不过没有关系,我们一点一点地来总结,那么关于图我想从以下几点进行总结: 1,图的定义? 2,图相关的概念和术语? 3,图的创建和遍历? 4,最小生成树和最短路径? 5,算法实现? 一,图的定义 什么是图呢? 图是一种复杂的非线性结构。 在线性结构中,数据元素之间满足唯一的线性关系,每个数据元素...
阅读全文
数据结构和算法系列16 哈夫曼树
摘要:这一篇要总结的是树中的最后一种,即哈夫曼树,我想从以下几点对其进行总结: 1,什么是哈夫曼树? 2,如何构建哈夫曼树? 3,哈夫曼编码? 4,算法实现? 一,什么是哈夫曼树 什么是哈夫曼树呢? 哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。下面用一幅图来说明。 它们的带权路径长度分别为: 图a: WPL=5*2+7*2+2*2+13*2=54 图b: WPL=5...
阅读全文
数据结构和算法系列15 线索二叉树
摘要:上一篇总结了二叉树,这一篇要总结的是线索二叉树,我想从以下几个方面进行总结。 1,什么是线索二叉树? 2,为什么要建立线索二叉树? 3,如何将二叉树线索化? 4,线索二叉树的常见操作及实现思路? 5,算法实现代码? 一,什么是线索二叉树 在有n个结点的二叉链表中必定存在n+1个空指针域,因此可以利用这些空指针域存放指向结点的某种遍历次序下的前趋和后继结点的指针,这种指向前趋和后继结点...
阅读全文
数据结构和算法系列14 二叉树
摘要:歇了几天了,没有写博客。从今天开始要总结树和二叉树了。那么什么是树呢? 1,树的定义: 1)有且仅有一个特定的称为根Root的结点。 2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集,其中每个集合本身又是一个棵树,并称为根的子树。 2,树的表示方法: 最常见的是树形表示法和广义表表示法,下面是树形表示法,如图所示。 上图的广义表表示法为:(A(B(D,E),C(F,G)...
阅读全文
数据结构和算法系列13 五大查找之哈希查找
摘要:这一篇要总结的是五天查找的最后一篇,哈希查找,也称为散列查找(本文以哈希称呼)。提起哈希,我的第一印象就是C#中的Hashtable类,它是由一组key/value的键值对组成的集合,它就是应用了散列技术。 那么,什么是哈希查找呢?在弄清楚什么是哈希查找之前,我们要弄清楚哈希技术,哈希技术是在记录的存储位置和记录的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key...
阅读全文
数据结构和算法系列12 五大查找之二叉排序树
摘要:这一篇开始总结的是二叉排序树。构造一棵二叉排序树的目的,其实并不是为了排序,而是为了提高查找和插入删除的效率。 那么什么是二叉排序树呢?二叉排序树具有以下几个特点。 1,若根节点有左子树,则左子树的所有节点都比根节点小。 2,若根节点有右子树,则右子树的所有节点都比根节点大。 3,根节点的左,右子树也分别为二叉排序树。 下面是二叉排序树的图示,通过图可以加深对二叉排序树的理解。 下...
阅读全文
数据结构和算法系列11 五大查找之索引查找
摘要:这一篇我们要总结的是索引查找,关于索引,我们很容易地联想到数据库中的索引,建立了索引,可以大大提高数据库的查询速度。 索引查找又称为分块查找,是一种介于顺序查找和二分查找之间的一种查找方法,分块查找的基本思想是:首先查找索引表,可用二分查找或顺序查找,然后在确定的块中进行顺序查找。 分块查找的时间复杂度为O(√n)。 在实现索引查找算法前需要弄清楚以下三个术语。 1,主表。即要查找的对象。...
阅读全文
数据结构和算法系列10 五大查找之二分查找
摘要:二分查找也属于顺序表查找范围,二分查找也称为折半查找。二分查找(有序)的时间复杂度为O(LogN)。 那么什么是二分查找呢?二分查找的基本思想是, 在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到找到为止。 从二分查找的定...
阅读全文
数据结构和算法系列9 五大查找之顺序查找
摘要:从这一篇开始要介绍算法中的查找技术了。查找在我们生活中无处不在,比如查公交,查机票,查酒店。。。这些都是查找。 首先来看一下查找技术的分类。如下图: 那么这篇要总结的是顺序表中的顺序查找技术。 什么是顺序查找呢?顺序查找的原理很简单,就是遍历整个列表,逐个进行记录的关键字与给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录。如果直到最后一个记录,其关键字和给定值比较都...
阅读全文
数据结构和算法系列8 七大排序之归并排序
摘要:这一篇要总结的是归并排序算法,这也是七大排序的最后一种排序算法。 首先来看一下归并排序(Merge Sort)的基本原理。它的原理是假设初始序列有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两合并,得到n/2个长度为2或1的有序子序列;再两两归并,… … ,如此重复,直至得到一个长度为n的有序序列为止,这两排序方法就称为归并排序。 下面以一张图来说明归并排序的数据交换过...
阅读全文
数据结构和算法系列7 七大排序之直接插入排序和希尔排序
摘要:这一篇要总结的是插入排序中的直接插入排序和希尔排序,主要分以下几点进行总结。 1,直接插入排序及算法实现 2,希尔排序及算法实现 3,直接插入排序PK希尔排序 1,直接插入排序及算法实现 什么是直接插入排序呢?直接插入排序的基本思想是:每次从无序表中取出第一条记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表。 直接插入排序的图解说明。 下面是直接插入排序的算法实现...
阅读全文
数据结构和算法系列6 七大排序之直接选择排序和堆排序
摘要:上一篇我们总结了交换排序的冒泡排序和快速排序。那么这一篇我们要总结的是选择排序,选择排序分为直接选择排序和堆排序,我们主要分以下几点进行总结。 1,直接选择排序及算法实现 2,堆排序及算法实现 1,直接选择排序及算法实现 直接选择排序(Straight Select Sort)是一种简单的排序方法,它的基本思想是:通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和...
阅读全文
数据结构和算法系列5 七大排序之冒泡排序和快速排序
摘要:排序是我们生活中经常会面对的问题。同学们做操时会按照从矮到高排列;老师查看上课出勤情况时,会按学生学号顺序点名;高考录取时,会按成绩总分降序依次录取等。排序是数据处理中经常使用的一种重要的运算,它在我们的程序开发中承担着非常重要的角色。 排序分为以下四类共七种排序方法: 交换排序: 1) 冒泡排序 2) 快速排序 选择排序: 3) 直接选择排序 4) 堆排序 插入排序: ...
阅读全文
数据结构和算法系列4 队列
摘要:上一篇讲了栈,这一篇要总结的是我们常用的队列,我想从以下几个方面进行总结。 1,什么是队列? 2,队列的存储结构? 3,队列的常用操作及实现代码? 1,什么是队列 1,首先,队列也是一种特殊的线性表,它是一种操作受限的线性表。它只允许在表的一端进行元素插入,而在另一端进行元素删除。允许插入的一端称为队尾(rear),允许删除的一端称为队头(font)。 2,对于队列,与现实生...
阅读全文
数据结构和算法系列3 栈
摘要:上一篇总结完了线性表之链表,这一篇文章我们要总结的是栈,我想从以下几个方面来进行总结。 1,什么是栈? 2,栈的存储结构? 3,栈的常见操作及代码实现? 1,什么是栈 首先栈是一种特殊的线性表。那它的特殊性表现在哪里呢?栈是限定在表的一端进行插入和删除运算的线性表,因此,栈也称为后进先出(LIFO)的线性表。 它有很多应用场景,比如食堂中的一叠盘子,我们只能从顶端一个一个地取...
阅读全文
数据结构和算法系列2 线性表之链表
摘要:上一篇我们总结完了顺序表,这一篇我们要总结的是线性表的链表,我想从以下几点进行总结。 1,为什么要使用链表? 2,链表的存储结构? 3,链表的常用操作代码实现? 1,为什么要使用链表 通过上一篇的学习,我们知道顺序表存在一些问题,主要有以下两个方面。 1,顺序表的长度是固定的,如果超出分配的长度就会造成溢出,如果存放的数据太少则会造成空间浪费。 2,在插入元素和删除元素...
阅读全文
数据结构和算法系列1 线性表之顺序表
摘要:十月份就要考数据结构了,为了这次考试能顺利通过。同时数据结构在开发过程中也是相当重要的,但是以前从来就没有系统地学习过。所以正好借此机会好好地学习下数据结构,一方面是为了通过考试,另一方面也把数据结构和算法这一块的基础打牢一点,真是一举两得啊。 我打算把这一部分写成一个系列,分为C#和C语言两个版本,每周发布两篇。从线性表开始,这一篇主要总结线性表之顺序表的相关操作,主要分以下几个部分来总结。 ...
阅读全文
重温数据结构与算法(2) 编程中最常用,最通用的数据结构---数组和ArrayList
摘要:1,什么是数组? 答:数组是一组同数据类型且可索引的数据的集合。 2,数组Array和ArrayList有何区别? 答:数组是固定大小的,而ArrayList是可变大小的。一,数组的使用(适用于固定大小)namespace ArrayDemo1{ class Program { static void Main(string[] args) { //1, 数组的声明和初始化,有两种方法 //方法一:常规方法 //string[] names=new string[5];//需要指...
阅读全文
重温数据结构与算法(1) 构建自己的时间测试类
摘要:本文总结了使用基准法测试来测试运行一个程序所使用的时间,或者说是测试程序中数据结构和算法的性能。 代码如下:namespace TimingTestDemo1{ //自定义计时类 public class Timing { //私有字段 TimeSpan duration; //构造函数,初始化字段 public Timing() { duration = new TimeSpan(0); } //开始计时 public void St...
阅读全文