数据结构和算法
Coding-lover
Keep hungry,Keep foolish(可通过微信联系我:unilay_yang)
展开
-
算法复杂度分析
为什么要进行算法分析?预测算法所需的资源 计算时间(CPU 消耗)内存空间(RAM 消耗)通信时间(带宽消耗)预测算法的运行时间 在给定输入规模时,所执行的基本操作数量。或者称为算法复杂度(Algorithm Complexity)如何衡量算法复杂度?内存(Memory)时间(Time)指令的数量(Number of Steps)特定操作的数量 磁盘访问数量网络包数量渐转载 2015-09-24 00:58:12 · 659 阅读 · 0 评论 -
线性表-顺序表和链表的比较
顺序表和链表各有短长。在实际应用中究竟选用哪一种存储结构呢?这要根据具体问题的要求和性质来决定。通常有以下几方面的考虑:┌───┬───────────────┬───────────────┐│ │ 顺序表 │ 链表 │├─┬─┼───────────────┼───────────────┤│基│分│静态分配。程序执行之前必须明确│动态分配只要内存空间尚有空转载 2014-08-17 21:37:32 · 672 阅读 · 0 评论 -
线性表-链式存储结构之循环链表
循环链表(Circular Linked List) 循环链表是一种首尾相接的链表。1、循环链表(1)单循环链表——在单链表中,将终端结点的指针域NULL改为指向表头结点或开始结点即可。(2)多重链的循环链表——将表中结点链在多个环上。2、带头结点的单循环链表注意: 判断空链表的条件是head==head->next;3、仅设转载 2014-08-17 18:19:41 · 1098 阅读 · 0 评论 -
插入排序-直接插入排序
下一页 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。 本节介绍两种插入排序方法:直接插入排序和希尔排序。直接插入排序基本思想1.直接插入排序的基本思想 直接插入排序(Straight Insertion Sorting)的基本思想是:把n个待排序的元转载 2014-08-21 22:39:56 · 836 阅读 · 0 评论 -
各种内部排序方法的比较和选择
按平均时间将排序分为四类:(1)平方阶(O(n2))排序 一般称为简单排序,例如直接插入、直接选择和冒泡排序;(2)线性对数阶(O(nlgn))排序 如快速、堆和归并排序;(3)O(n1+£)阶排序 £是介于0和1之间的常数,即0(4)线性阶(O(n))排序 如桶、箱和基数排序。各种排序方法比较简单排序中直接插入最好,快速排序最快,当转载 2014-08-21 23:34:25 · 937 阅读 · 0 评论 -
线性表-顺序存储结构之顺序表
顺序表 1. 顺序表的定义 (1) 顺序存储方法 即把线性表的结点按逻辑次序依次存放在一组地址连续的存储单元里的方法。(2) 顺序表(Sequential List) 用顺序存储方法存储的线性表简称为顺序表(Sequential List)。2. 结点ai 的存储地址 不失一般性,设线性表中所有结点的类型相同,则每个结点所占用存储空间大小亦相同。假设表中每个转载 2014-08-14 20:35:58 · 3246 阅读 · 0 评论 -
选择排序-直接选择排序
选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。 常用的选择排序方法有直接选择排序和堆排序。直接选择排序(Straight Selection Sort)1、直接选择排序的基本思想 n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:①初始状态:无转载 2014-08-21 22:59:56 · 624 阅读 · 0 评论 -
交换排序-冒泡排序
希尔排序(Shell Sort)是插入排序的一种。因D.L.Shell于1959年提出而得名。希尔排序基本思想基本思想: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2 该方法实质上是一种分组插入方法。给定实例的shell排序的排序过程 假设转载 2014-08-21 22:48:19 · 734 阅读 · 0 评论 -
数据结构概述
数据结构(Data Structure)简称DS,研究的是计算机所处理数据元素间的关系及其操作实现的算法。包括数据的逻辑结构、数据的存储结构以及数据的操作。数据结构在计算机科学中涉及到计算机硬件(特别是编码理论、存储机制等)、计算机软件的研究(无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题)。因此可以认为,数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程,转载 2014-08-13 16:02:33 · 1290 阅读 · 0 评论 -
算法的时间复杂度和空间复杂度-总结
算法的时间复杂度和空间复杂度-总结 通常,对于一个给定的算法,我们要做 两项分析。第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式、数学归纳法等。而在证明算法是正确的基础上,第二部就是分析算法的时间复杂度。算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的优劣与否。因此,作为程序员,掌握基本的转载 2014-08-13 19:40:30 · 2799 阅读 · 0 评论 -
线性表的逻辑定义
线性表的逻辑定义 线性表(Linear List)是由n(n≥0)个数据元素(结点)a1,a2,…,an组成的有限序列。 ① 数据元素的个数n定义为表的长度(n=0时称为空表)。 ② 将非空的线性表(n>0)记作:(a1,a2,…,an) ③ 数据元素ai(1≤i≤n)只是个抽象符号,其具体含义在不同情况下可以不同。 【例1】英文字母表(A,B,…,Z)是线性表,表中每转载 2014-08-14 19:25:59 · 1216 阅读 · 0 评论 -
抽象数据类型定义(ADT)
一、抽象数据类型定义(ADT)作用:抽象数据类型可以使我们更容易描述现实世界。例:用线性表描述学生成绩表,用树或图描述遗传关系。定义:一个数学模型以及定义在该模型上的一组操作。关键:使用它的人可以只关心它的逻辑特征,不需要了解它的存储方式。定义它的人同样不必要关心它如何存储。例:线性表这样的抽象数据类型,其数学模型是:数据元素的集合,该集合内的元素有这样的关系:除第一个和最后一转载 2014-08-14 13:33:48 · 15470 阅读 · 3 评论 -
文件的基本概念
本章简介 在数据处理方面,特别是事务型的软件编制工作中,都涉及到有关文件的知识。有效地组织数据,提供方便而又高效地利用数据信息的方法,是文件这一章所要讨论的内容。尽管数据管理技术早已从文件系统发展到数据库系统,但因为文件系统是数据库系统的基础,从专用、高效和系统软件研制角度看,文件系统仍有其不可取代的地位。正如高级语言出现后,汇编语言仍是软件研制的重要工具一样。文件概念1.文转载 2014-08-25 20:05:03 · 1345 阅读 · 0 评论 -
算法的特征及设计要求
算法的特征 嗯,算法具有五个基本特征:输入、输出、有穷性、确定性和可行性。 输入算法具有零个或多个输入。尽管对于绝大多数算法来说,输入参数都是必要的。但是有些时候,像打印“I love fishc.com”,就不需要啥参数啦。void print(){ printf(“I love fishc.comn”);}转载 2014-08-13 16:18:27 · 914 阅读 · 0 评论 -
树上的查找-B-树
当查找的文件较大,且存放在磁盘等直接存取设备中时,为了减少查找过程中对磁盘的读写次数,提高查找效率,基于直接存取设备的读写操作以"页"为单位的特征。 1972年R.Bayer和E.M.McCreight提出了一种称之为B-树的多路平衡查找树。它适合在磁盘等直接存取设备上组织动态的查找表。B-树的定义1、B-树的定义 一棵m(m≥3)阶的B-树是满足如下性质的m叉树:(1转载 2014-08-24 20:30:06 · 2168 阅读 · 0 评论 -
树上的查找-二叉排序树
当用线性表作为表的组织形式时,可以有三种查找法。其中以二分查找效率最高。但由于二分查找要求表中结点按关键字有序,且不能用链表作存储结构,因此,当表的插入或删除操作频繁时,为维护表的有序性,势必要移动表中很多结点。这种由移动结点引起的额外时间开销,就会抵消二分查找的优点。也就是说,二分查找只适用于静态查找表。若要对动态查找表进行高效率的查找,可采用下面介绍的几种特殊的二叉树或树作为表的组织形式。不妨转载 2014-08-24 20:08:27 · 3315 阅读 · 0 评论 -
交换排序-快速排序
快速排序(QuickSort)1、算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。(1) 分治法的基本思想 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。(转载 2014-08-21 22:55:00 · 681 阅读 · 0 评论 -
线性表-链式存储结构之单链表
单链表1、链接存储方法 链接方式存储的线性表简称为链表(Linked List)。 链表的具体存储表示为: ① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的) ② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer转载 2014-08-16 12:08:08 · 1846 阅读 · 0 评论 -
特殊的线性表-栈的定义及基本运算
栈和队列是两种特殊的线性表,它们的逻辑结构和线性表相同,只是其运算规则较线性表有更多的限制,故又称它们为运算受限的线性表。栈和队列被广泛应用于各种程序设计中。栈的定义及基本运算1、栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。 (1)通常称插入、删除的这一端为栈顶(Top),另一端称为栈底(Bottom)。 (2)当表中没有元素时称为空栈。转载 2014-08-17 22:44:40 · 1154 阅读 · 0 评论 -
经典排序算法总结与实现
后面的排序默认从小到大排列冒泡排序(Bubble sort) 原理冒泡排序是一种简单的排序算法。它重复访问要排序的数列,每一次比较两个元素,如果前一个大于后一个元素,则交换数据。那么在一次全部访问过程中,最大的元素就’浮’动到数列的最后。然后重复进行方法,知道再没有数据交换,也就是数列已经排序完成。步骤比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一转载 2015-09-18 21:39:33 · 511 阅读 · 0 评论 -
典型的Top K算法
找出一个数组里面前K个最大数…或找出1亿个浮点数中最大的10000个…一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入内存,问最优解… 应用场景:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个转载 2015-09-18 23:08:44 · 665 阅读 · 0 评论 -
缓存淘汰算法——LRU类
缓存淘汰算法系列之1——LRU类1. LRU1.1. 原理LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。1.2. 实现最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:1. 新数据插入到链表头部;2. 每转载 2014-12-31 00:52:20 · 757 阅读 · 0 评论 -
一致性哈希算法介绍,及java实现
应用场景在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin)、哈希算法(HASH)、最少连接算法(Least Connection)、响应速度算法(Response Time)、加权法(Weighted )等。其中哈希算法是最为常用的算法.典型的应用场景是: 有N台服务器提供缓存服务,需要对服务器进行负载均衡,将请求平均分发到每台服务器上转载 2014-12-19 01:44:03 · 826 阅读 · 0 评论 -
《数据结构》大纲目录(脑图)
《数据结构》考试大纲 数据结构是计算机科学与技术及相关学科的重要基础,要求考生系统地理解数据结构的基本概念,掌握各种数据结构的定义和实现算法。要求考生具有抽象思维能力,逻辑推理能力,和综合运用所学的知识分析问题和解决问题的能力。一、绪论1. 数据结构的基本概念,数据的逻辑结构、存储结构。2. 算法的定义、算法的基本特性以及算法分析的基本概念。转载 2014-08-14 16:42:07 · 4981 阅读 · 3 评论 -
程序员必知8大排序3大查找
每天都在叫嚣自己会什么技术,什么框架,可否意识到你每天都在被这些新名词、新技术所迷惑,.NET、XML等等技术固然诱人,可是如果自己的基础不扎实,就像是在云里雾里行走一样,只能看到眼前,不能看到更远的地方。这些新鲜的技术掩盖了许多底层的原理,要想真正的学习技术还是走下云端,扎扎实实的把基础知识学好,有了这些基础,要掌握那些新技术也就很容易了。 要编写出优秀的代码同样要扎实的基础,如转载 2014-11-30 16:51:33 · 800 阅读 · 0 评论 -
8大排序算法图文讲解
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。本文将依次介绍上述八大排序算法。算法一:插入排序 插入排序示意图插入排序是一种最简单直转载 2014-08-29 22:28:35 · 606 阅读 · 0 评论 -
矩阵的压缩存储
矩阵是科学与工程计算问题中常用的数学对象之一。矩阵的存储 1、矩阵的二维数组描述 矩阵用二维数组描述时,存储的密度为1。可以对其元素进行随机存取,各种矩阵运算也非常简单。2、矩阵的压缩存储 矩阵中非零元素呈某种规律分布或者矩阵中出现大量的零元素的情况下,为了节省存储空间,我们可以对这类矩阵进行压缩存储:即为多个相同的非零元素只分配一个存储空间;对零元素不分配空间。转载 2014-08-18 16:17:28 · 1223 阅读 · 0 评论 -
特殊的线性表-串-链式存储
串的链式存储 1、链串 用单链表方式存储串值,串的这种链式存储结构简称为链串。转载 2014-08-18 14:49:34 · 1086 阅读 · 0 评论 -
广义表
广义表的概念 广义表(Lists,又称列表)是线性表的推广。即广义表中放松对表元素的原子限制,容许它们具有其自身结构。1、广义表定义 广义表是n(n≥0)个元素a1,a2,…,ai,…,an的有限序列。其中: ①ai--或者是原子或者是一个广义表。 ②广义表通常记作:Ls=( a1,a2,…,ai,…,an)。 ③Ls是广义表的名字,n为它的长度。转载 2014-08-18 16:37:33 · 1123 阅读 · 0 评论 -
特殊的线性表-队列-链队列
链队列 1、 链队列的定义 队列的链式存储结构简称为链队列。它是限制仅在表头删除和表尾插入的单链表。2、 链队列的结构类型说明转载 2014-08-18 10:46:30 · 1142 阅读 · 0 评论 -
特殊的线性表-栈-链栈
链栈 栈的链式存储结构称为链栈。1、链栈的类型定义 链栈是没有附加头结点的运算受限的单链表。栈顶指针就是链表的头指针。转载 2014-08-18 09:18:01 · 938 阅读 · 0 评论 -
特殊的线性表-栈-顺序栈
栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表。1、 顺序栈的类型定义注意: ①顺序栈中元素用向量存放 ②栈底位置是固定不变的,可设置在向量两端的任意一个端点 ③栈顶位置是随着进栈和退栈操作而变化的,用一个整型量top(通常称top为栈顶指针)来指示当前栈顶位置2、 顺序栈的基本操作 前提条件: 设S是SeqStack类型的指针变量。若栈底位置在向量的转载 2014-08-18 08:45:47 · 850 阅读 · 0 评论 -
特殊的线性表-队列-顺序队列
1、定义 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表转载 2014-08-18 09:59:17 · 696 阅读 · 0 评论 -
特殊的线性表-队列的定义及基本运算
1、定义 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表转载 2014-08-18 09:34:17 · 623 阅读 · 0 评论 -
线性表-链式存储结构之双链表
1、双向链表(Double Linked List) 双(向)链表中有两条方向不同的链,即每个结点中除next域存放后继结点地址外,还增加一个指向其直接前趋的指针域prior。转载 2014-08-17 21:21:46 · 843 阅读 · 0 评论 -
散列技术-散列表上的运算
散列表上的运算 散列表上的运算有查找、插入和删除。其中主要是查找,这是因为散列表的目的主要是用于快速查找,且插入和删除均要用到查找操作。1、散列表类型说明:#define NIL -1 //空结点标记依赖于关键字类型,本节假定关键字均为非负整数#define M 997 //表长度依赖于应用,但一般应根据。确定m为一素数typedef struct{ //散列表结点类转载 2014-08-24 20:47:09 · 961 阅读 · 0 评论 -
散列技术-处理冲突的方法
处理冲突的方法 通常有两类方法处理冲突:开放定址(Open Addressing)法和拉链(Chaining)法。前者是将所有结点均存放在散列表T[0..m-1]中;后者通常是将互为同义词的结点链成一个单链表,而将此链表的头指针放在散列表T[0..m-1]中。1、开放定址法(1)开放地址法解决冲突的方法 用开放定址法解决冲突的做法是:当冲突发生时,使用某种探查(亦称探测)转载 2014-08-24 20:42:41 · 3646 阅读 · 0 评论 -
哈夫曼树及其应用-最优二叉树
最优二叉树概念1.树的路径长度 树的路径长度是从树根到树中每一结点的路径长度之和。在结点数目相同的二叉树中,完全二叉树的路径长度最短。2.树的带权路径长度(Weighted Path Length of Tree,简记为WPL) 结点的权:在一些应用中,赋予树中结点的一个有某种意义的实数。 结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积。 树的带权路转载 2014-08-20 20:59:15 · 1224 阅读 · 0 评论 -
线索二叉树的运算
线索二叉树的运算1. 查找某结点*p在指定次序下的前趋和后继结点(1)在中序线索二叉树中,查找结点*p的中序后继结点 在中序线索二叉树中,查找结点*p的中序后继结点分两种情形: ① 若*p的右子树空(即p->rtag为Thread),则p->rchild为右线索,直接指向*p的中序后继。 【例】下图的中序线索二叉树中,结点D的中序后继是A。 ②转载 2014-08-20 15:38:17 · 1154 阅读 · 0 评论 -
线索二叉树
线索二叉树概念1.定义 n个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为"线索")。 这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。 注转载 2014-08-20 15:30:10 · 729 阅读 · 0 评论