数据结构与算法
只为心中梦
喜欢编程,喜欢探索,欢迎大佬们提意见
展开
-
面试---数据结构(3)(链表)
1**除了用数组描述线性表还可以用链表描述线性表** 2在链式描述中,线性表的元素在内存中的存储位置是随机的。每个元素都有一个明确的指针或链指向线性表的下一个元素的位置(即地址) *数组和链表的区别: 在数组中,元素的地址是由数学公式决定的,而在链式描述中,元素的地址是随机分布的 顺序表是顺序存储,非顺序存取,链表是非顺序存储。顺序存取 因此链式表便于插入,删除操作,不便于查询3链表分为单原创 2017-07-29 21:47:20 · 265 阅读 · 0 评论 -
面试--数据结构(5)(树)
树(Tree)是n(n≥0)个结点的有限集。在任意一棵非空树中:(1)有且仅有一个特定的被称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。 结点拥有的子树数称为结点的度(Degree)。度为0的结点称为叶子(Leaf)或终端结点。度不为0的结点称为非终端结点或分支原创 2017-07-31 19:18:23 · 316 阅读 · 0 评论 -
数据结构总复习
核心要点–必须掌握掌握数据结构的基本概念和术语。包括:数据,数据元素,数据项,数据结构等基本概念算法和算法分析:掌握算法,算法的时间复杂度和空间复杂度,掌握算法分析的方法,对一般算法能分析处时间复杂度。还有算法的特性。掌握线性表的定义和逻辑结构,了解线性表的基本运算,掌握顺序表的插入和删除操作及平均时间性能分析熟练掌握单链表,插入和删除操作并分析其时间复杂度了解循环单链表算法和单链表上相原创 2017-08-01 09:42:58 · 993 阅读 · 0 评论 -
时间复杂度分析
关键概念 要分析算法的复杂度,通常需要分析循环的运行.一,假如,某个循环体的复杂度是O(1),那么这个循环的时间复杂度就是O(n). for(int i = 0; i < n; i++){ //一些列复杂度为O(1)的步骤…. } 通常,如果某个循环结构以线性方式运行n次,并且循环体的时间复杂度都是O(1),那么该循环的复杂度就是O(n). 即使,该循环跳过某些常数部原创 2017-08-01 15:43:56 · 517 阅读 · 0 评论 -
哈夫曼树和线索二叉树
线索二叉树的思想来源于二叉树的存储结构中,存在一些空的指针域,因此是否能够将这些空间利用起来,存储一些关于节点间先后顺序的信息,由此产生了线索二叉树。线索二叉树中,线索反映前驱、后继的关系,而指针则体现左右子树。 以二叉链表为例,线索二叉树存储结构上的特点是添加标识符,表明左右指针域究竟存的是指向前驱和后继的线索,还是指向左右子树的指针; 线索二叉树的优势是一旦对一棵二叉树建立了相应的线原创 2017-08-01 16:20:49 · 721 阅读 · 0 评论 -
最小生成树算法--prim算法和克鲁斯卡尔算法
首先说一下prim算法: 在网上找的图片流程: 文字解释: 第一步:选取0为顶点,根据图中b知道,他一共有5条路径,选取权值最少的一条,即0—2, 第二步:现在顶点为0和2,根据图中c知一共有4条路径,选取权值最小的,即2—-5 第三步:以1,2,5为顶点,选取权值最小的,一直循环往复,知道找出n个顶点,n-1条边。 注意:其中图中不能出现环路,以为有的边的权值相同,所以最小生成树有时候原创 2017-08-02 09:01:11 · 545 阅读 · 0 评论 -
拓扑排序
由AOV网构造拓扑序列的拓扑排序算法主要是循环执行以下两步,直到不存在入度为0的顶点为止。 (1) 选择一个入度为0的顶点并输出之; (2) 从网中删除此顶点及所有出边。 循环结束后,若输出的顶点数小于网中的顶点数,则输出“有回路”信息,否则输出的顶点序列就是一种拓扑序列。流程展示:原创 2017-08-02 11:11:51 · 257 阅读 · 0 评论 -
排序算法--归并排序
思路:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列 代码: public static int[] sort(int[] nums, int low, int high) { int mid = (low + high) / 2; if (low < high) {原创 2017-08-13 15:55:44 · 325 阅读 · 0 评论 -
面试---数据结构基础 (1)
一,数据结构的定义:1,数据的组织形式 2,简单来说数据结构是一门研究非数值计算的程序设计问题中计算 机的操作对象以及他们之间的关系和操作的学科 3,相互之间存在一种或多种特定关系的数据元素的集合 说法1着重强调存储结构,说法2着重强调逻辑结构*二,存储形式 1.线性:数组,串,表,队列,栈 2非线性:树和图 3文件:非线性和线性三,存储结构 顺序结构:数据元素相对位置相邻原创 2017-07-28 17:48:33 · 299 阅读 · 0 评论 -
查找算法(3)--二叉树查找
二叉查找树的定义: 一棵二叉查找树是一棵可能为空的二叉树形,并且关键词各不相同,二叉查找树中的任一结点P,他的左子树中结点的关键词都小于KEY(p),而右子树中结点的关键词都大于kEY(p),并且节点P的左右子树也都是二叉查找树代码展示:package com.jls.tree;public class BinarySearchTree<T extends Comparable<T>>{原创 2017-07-31 18:18:34 · 665 阅读 · 0 评论 -
查找算法(2)--二分查找算法
二分查找也称折半查找, 流程: 假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。代码展示:public static int bina原创 2017-07-31 14:22:05 · 303 阅读 · 0 评论 -
查找算法(1)基本概念
*查找表:是由同一类型的数据元素构成的集合 查找表分为静态查找表和动态查找表; 静态查找表:建表,查表,读表 动态查找表:建表,查表,读表,插入,删除关键字:是数据元素中某个关键字的值,可以标识一个数据元素主关键字:可以唯一标识一个数据元素的关键字叫主关键字查找表结果:成功和失败原创 2017-07-31 10:52:51 · 226 阅读 · 0 评论 -
面试---数据结构(4)(队列和栈)
1*二者区别* *队列是插入在一端进行而删除在另一端进行 *栈是插入和删除只能在其一端进行的线性表 2*二者特点* *栈–》有序性,先进后出 *队列–》有序性,先进先出3栈的指针永远指向栈顶 判断栈空的条件 top==-1 判断栈满的条件 top==maxStackSize-14链式栈是非顺序存储的,而队列是顺序存储和链式存放5**栈里进行运算使用后缀表达式。** A*原创 2017-07-30 08:02:46 · 277 阅读 · 0 评论 -
面试---算法排序基础(1)
首先了解一下排序中的关键词: 排序:就是把一组记录按照某个域的值递增或递减的次序重新排序的过程主关键字:能唯一标识某一记录标的关键字叫主关键字稳定性:具有相同关键字的记录排序前后保持他们原来的相对次序不变,则称该排序过程具有稳定性内部排序:若排序过程都在内存中进行,则称为内部排序外部排序:若排序过程需要不断的进行内存和外存之间的数据交换,则称为外部排序原创 2017-07-30 09:25:12 · 254 阅读 · 0 评论 -
面试---算法排序(3)(希尔排序)
shell排序: 严格来说基于插入排序的思想,又称希尔排序或者缩小增量排序 流程: ①将有n 个元素的数组分成n/2个数字序列,第1个数据和第n/2+1个数据为1对,第2个数据和第n/2+2个数据为一对…. ②一次循环使每一个序列队排好顺序 ③然后,再变为n/4个序列,再次排序 ④不断重复上述过程,随着序列减少最后变成一个,也就完成了整个排序代码展示:package third;pub原创 2017-07-30 12:09:35 · 501 阅读 · 0 评论 -
面试---算法排序(2)(插入排序)
直接插入排序思想: 将一个记录插入到已排好序的有序表中,从而得到一个新的 ,记录数增一的有序表。插入排序算法 通过对未排序的数据执行逐个插入至合适的位置而完成排序工作 流程如下: ①首先对数组的前两个数据进行从小到大的排序 ②接着将第三个数据与排好序的两个数据比较,将第三个数据插入合适的位置 ③然后将第四个数据插入已排好序的前三个数据中 ④不断重复上述过程,直到把最后一个数据插入合适的原创 2017-07-30 09:43:53 · 330 阅读 · 0 评论 -
面试---算法排序(4)(选择排序)
选择排序 流程: ①首先从原始数组中选择最小的1个数据,将其和位于第1个位置的数据交换 ②接着从剩下的n-1个数据中选择次小的1个数据,将其和第2个位置的数据交换 ③然后不断重复上述过程代码展示:package third;import java.util.ArrayList;public class xz {public static void xz(int a[]){ for(原创 2017-07-30 16:09:12 · 320 阅读 · 0 评论 -
面试--算法排序(5)(堆排序)
堆排序也是选择排序的一种 堆的定义: 如果有一个关键码K={k1,k2,k3…..}把他的所有元素按照完全二叉树的顺序存储方式放在一个一维数组中。并且满足 ki<=k2i且ki<=k2i+1//小根堆 ki>=k2i且Ki>=K2i+1//大根堆 小根堆效果图: 大根堆效果图 堆排序: 若在输出堆栈的最大值之后,使得剩余n-1个元素的序列又建成一个堆,则得到n个元素中的次大值,如此反原创 2017-07-30 17:32:28 · 357 阅读 · 0 评论 -
面试--算法排序(6)(冒泡排序)
冒泡排序: 思路就是交换排序,通过相邻数据的交换来达到排序的目的 流程: ①对数组中的各数据,依次比较相邻的两个元素的大小 ②如果前面的数据大于后面的数据就交换两个数据,经过第一轮的多次比较排序后,便可将最小的数据排好 ③再用同样的方法把剩下的数据逐个比较代码展示:package third;public class mp {public static void mp(int a[]){原创 2017-07-30 21:27:17 · 257 阅读 · 0 评论 -
面试--算法排序(7)(快速排序)
原理:和冒泡排序相似,都是基于交换排序思想的,就是对冒泡排序的改进 流程: ①首先设定一个分界值,通过该分界值将数组分成两部分, ②将大于等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的坐边 ③然后,坐边和右边的数据可以独立排序,对于左侧的数组元素,又可以取一个分界值,将该部分分成左右两部分,同样,右侧也会这样 4重复上述过程,递归代码展示:package com.jls.te原创 2017-07-31 09:06:52 · 340 阅读 · 0 评论 -
面试---数据结构(2)(数组)
数组的定义 所谓数组,是无序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。 这些无序排列的同类数据元素的集合称为数组。数组是一种线性结构顺序表 特点: 1.数组是相原创 2017-07-29 08:53:26 · 588 阅读 · 0 评论