算法与数据结构
不吃辣。
这个作者很懒,什么都没留下…
展开
-
算法与数据结构之循环队列
为什么静态队列必须是循环队列?静态队列也就是用数组实现的队列,在非空队列中,头指针指向队头元素,尾指针指向队列尾元素的下一个位置,对于非循环队列来说,假设为队列分配的最大空间为6,当尾指针指向第7个元素的位置时,不可再继续插入新的队尾元素,否则会因数组越界而导致程序代码被破坏,而此时又不宜如顺序栈那样,进行存储再分配扩大数组空间。因为队列的实际可用空间并未占满,一个巧妙的方法是将顺序队列臆造为一...原创 2019-01-25 19:38:18 · 485 阅读 · 0 评论 -
算法与数据结构之冒泡排序,选择排序,插入排序
冒泡排序思路:每相邻的两个数进行比较,如果前者比后者大就交换,否则不交换,如先进行下标为0和下标为1的数的比较,0位置的数比1大就交换,否则不交换,在比较下标为1和下标为2的数,前者比后者大就交换,否则不交换,如此下去,经过一轮比较后,最后一个位置上就是这组数据中最大数,在第二轮的比较中,假设总共有N个数,此时只需要对前N-1个数进行相邻两个数的比较,经过第二轮的比较会出现一个最大数放在下N-1...原创 2019-02-16 22:12:37 · 213 阅读 · 0 评论 -
算法与数据结构之堆排序
堆结构:就是一颗完全二叉树,二叉树是不存在的,可以脑补,真正实现堆结构的是数组叶节点:没有左右孩子的节点满二叉树:最后一层都是叶节点,并且填满最后一层完全二叉树:满二叉树属于完全二叉树,满二叉树从右往左依次去叶节点形成的树就是完全二叉树数组下标位置为i,在不越界的情况下:2 * i+1是i位置数的左孩子2 * i+2是i位置数的右孩子(i-1)/2是父节点越界可以认为没有堆结构分...原创 2019-02-25 20:30:47 · 149 阅读 · 0 评论 -
算法与数据结构之快速排序
经典快排:给定一组数据,以这组数据的最后一个数为划分,假如最后一个数为x,则<=x放在左边,>x的放在右边分别以左边和右边的最后一个数为划分,重复上述过程,这就是经典快排荷兰国旗改进后的快排:荷兰国旗问题:算法与数据结构笔试面试:荷兰国旗问题还是以这组数据的最后一个数为划分,但是<x的放左边,==x的放中间,>x的放右边,再次从<x和>x的区域选最后一...原创 2019-02-25 20:56:31 · 244 阅读 · 0 评论 -
算法与数据结构之基于数组的栈的实现Java版
栈的应用在这里举几个比较常见的栈应用的例子子过程的调用,每当在一个函数中调用另一个函数时,就会发生子过程的调用,而这个工程的实现就用到了栈,当程序执行到子函数所在的行时,会将此时的执行信息压入到系统栈中,当执行完子函数后,会将系统栈中的内容出栈,然后接着执行主函数,最常见的例子就是递归的调用。undo操作,也就是撤销操作,ctrl+z,每当我们在编译器输入词汇的时候,编译器会将我们输入的内...原创 2019-04-22 17:31:22 · 186 阅读 · 0 评论 -
算法与数据结构之基于数组实现的数组队列和循环队列Java版
操作public interface Queue<E> { void enqueue(E e); E dequeue(); E getFront(); int getSize(); boolean isEmpty();}数组队列复杂度分析可以看到出队的时间复杂度为O(n), 因为我们出队的时候,是将第一个元素出队,此后,后面的所有元素都需要向前移动一个位置, 用...原创 2019-04-22 17:52:18 · 153 阅读 · 0 评论 -
算法与数据结构之动态数组的实现Java版
动态数组的特点可实现数组的扩容和缩容实现了泛型操作获取数组的容量 getCapacity获取数组中的元素个数 getSize返回数组是否为空 isEmpty在指定索引位置插入一个新元素add向所有元素后添加一个新元素 addLast在所有元素前添加一个新元素 addFirst获取指定索引位置的元素 get修改指定索引位置的元素为指定的元素 set查找数组中是否有指定的...原创 2019-04-19 11:42:00 · 215 阅读 · 0 评论 -
算法与数据结构之带头节点的链表的实现Java版
操作获取链表中的元素个数返回链表是否为空在链表的index位置添加元素在链表头添加元素在链表末尾添加元素获取链表第index位置元素获取链表第一个元素获取链表最后一个元素修改链表第index位置元素查找链表中是否含有元素e删除index位置的元素删除第一个元素删除最后一个元素删除元素e时间复杂度分析添加操作:O(n)addLast(e) O(n)addFi...原创 2019-04-24 21:47:59 · 190 阅读 · 0 评论 -
算法与数据结构之基于链表实现的栈和队列
链表实现的栈底层链表的实现基于算法与数据结构之带头节点的链表的实现Java版时间复杂度都为O(1),与算法与数据结构之基于数组的栈的实现Java版相同操作:public interface Stack<E> { int getSize(); //元素个数 boolean isEmpty(); //是否为空 void push(E e); //入栈 E pop(); //...原创 2019-04-24 23:11:47 · 159 阅读 · 0 评论 -
算法与数据结构之二分搜索树(BST)
二分搜索树二分搜索树是一颗二叉树,二分搜索树的每个节点的值:大于其左子树的所有节点的值,小于其右子树的所有节点的值,每一颗子树也是二分搜索树,二分搜索树存储的元素必须具有可比较性二分搜索树的定义public class BST<E extends Comparable<E>> { private class Node { public E e; publ...原创 2019-05-09 18:10:54 · 132 阅读 · 0 评论 -
算法与数据结构之递归行为时间复杂度估算
对递归行为时间复杂度的估算需要使用到master公式master公式:T(N) = a*T(N/b) + O(N^d)T(N):样本量大小为N的情况下,时间复杂度N/b:子过程的样本量a:子过程发生的次数,不是一共分了多少次,从代码上看分的次数,比如用递归求一组数据的最大值,从中间分开求出左边最大值,在求出右边最大值,最后求整组数据的最大值,在这个过程中子过程发生的次数为两次O(N^d...原创 2019-02-15 22:02:11 · 266 阅读 · 0 评论 -
算法与数据结构之对数器
为什么要使用对数器比如,自己手写了一个冒泡排序,怎么测试自己写的排序算法是否正确呢,就要去试各种数据,各种情况,但是我们并不是能够照顾到每一种情况,也可以依赖OJ但是并不一定能找到自己想要测试的方法,此时就需要对数器来检验方法是否正确对数器的概念和使用0,有一个你想要测的方法a,1,实现一个绝对正确但是复杂度不好的方法b,2,实现一个随机样本产生器3,实现比对的方法4,把方法a和方法...原创 2019-02-15 21:39:06 · 351 阅读 · 0 评论 -
算法与数据结构之数组实现
顺序表:线性表的顺序存储结构是一种随机存取的存储结构。顺序表存储结构容易实现随机存取线性表的第 i 个数据元素的操作,但在实现插入、删除的操作时要移动大量数据元素,所以,它适用于数据相对稳定的线性表,如职工工资表、学生学籍表等顺序表插入,删除操作的时间复杂度设pi是在第i个元素之前插入一个元素的概率,则在长度为n的线性表中插入一个元素时所需移动元素次数的平均次数为:E1=∑i=1n+1pi...原创 2018-12-31 13:02:21 · 204 阅读 · 0 评论 -
算法与数据结构之链式队列
队列和栈相反,队列是一种先进先出的线性表,简称FIFO结构,它只允许在表的一端进行删除元素,另一端进行插入元素,允许插入的一端称为队尾,允许删除的一端称为队头链式队列的实现#include&lt;stdio.h&gt;#include&lt;malloc.h&gt;#include&lt;stdlib.h&gt;//队列的链式存储结构typedef struct Node{原创 2019-01-25 18:42:01 · 184 阅读 · 0 评论 -
算法与数据结构之链式栈
顺序栈和链式栈比较由于栈只在表的一端进行插入和删除的操作,采用顺序存储结构,在入栈和出栈时也不需要移动栈中元素。故顺序栈比链栈的效率要高一些链式栈栈也是线性表,是操作受限的线性表。栈的操作是线性表操作的子集。因此,也可以将线性表的结构作为栈的结构。可把带头结点的线性单链表结构作为链栈的结构,链式结构的实现如下所示#include&lt;stdio.h&gt;#include&lt;ma...原创 2019-01-24 16:08:43 · 377 阅读 · 0 评论 -
算法与数据结构之顺序栈
栈栈:限定仅在表尾进行插入或删除操作的线性表,表尾称为栈顶,表头称为栈底,不含元素的空表称为空栈。栈又被称为后进先出的线性表(简称LIFO结构)顺序栈栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。下面为顺序栈的实现,包括操作:初始化栈、销毁栈、置空栈、判断栈空、栈元素个数、获取栈顶元素、入栈、出栈、遍历栈中元素...原创 2019-01-24 15:58:13 · 646 阅读 · 0 评论 -
算法与数据结构之双向循环链表
双向循环链表双向链表每结点有两个指针,一个指向结点的前驱,另一个指向结点的后继,所以从链表的每一个结点出发,都可到达任意一个结点,有利于链表的查找,单链表的找前驱函数,除了有指向当前结点的指针外,还有一个紧跟其,一直指向其前驱的指针。在双向链表中。不需要这个指向前驱的指针。双向循环链表的实现#include&amp;lt;stdio.h&amp;gt;#include&amp;lt;malloc.h&amp;gt;#i...原创 2019-01-19 09:07:09 · 174 阅读 · 0 评论 -
算法与数据结构之单循环链表
单循环链表单链的循环链表结点的存储结构和单链表的存储结构一样,所不同的是:最后一个结点的 next 域指向头结点,而不是“空”。这样,由表尾很容易找到表头。但若链表较长,则由表头找到表尾较费时,因而,单循环链表往往设立尾指针而不是头指针,这在两个链表首尾相连合并成一个链表时非常方便。单循环链表的基本操作实现#include&lt;stdio.h&gt;#include&lt;malloc....原创 2019-01-16 21:26:41 · 1027 阅读 · 0 评论 -
算法与数据结构之静态链表
静态链表结构体的一个成员存放数据,另一个成员(“游标”)存放下一个数的位置(下标),这称为静态链表。输出链表不是按数组的下标顺序输出的,而是由一个指定的位置开始根据游标依次输出的。将所有空闲结点链接形成一个备用链表,数组下标为 0 的单元为备用链表的头结点(这时,链表的头结点就不能再是数组下标为 0 的单元了,需要另外定义)。静态数组实际有 2 个链表,一个链表上链接的是线性表的结点,另一个...原创 2019-01-05 18:54:55 · 323 阅读 · 0 评论 -
算法与数据结构之不带头结点的单链表
不带头结点的单链表和带头结点的单链表和带有头结点的单链表相比,不带头结点的单链表显得更直观。但不带头结点的单链表在插入和删除第 1 个元素时与插入和删除其它元素时的操作不一样,在创建链表时也不一样,要改变链表头指针的值。而带有头点的单链表无论插入和删除第几个元素,其操作都是统一的。对插入和删除参数传递存在问题,以及对程序运行后出现的乱码存在问题带头结点和不带头结点单链表存在的问题不带头结点...原创 2019-01-03 15:40:54 · 1191 阅读 · 0 评论 -
算法与数据结构之带头结点和不带头结点单链表存在的问题
带头结点和不带头结点单链表注意的小细节在写不带头结点的单链表中发现了一个问题,这个问题在带头结点的单链表中也存在,那就是值传递的问题。首先来看一下#include&amp;amp;lt;stdio.h&amp;amp;gt;#include&amp;amp;lt;malloc.h&amp;amp;gt;#include&amp;amp;lt;stdlib.h&amp;amp;gt;#def原创 2019-01-03 15:13:49 · 4001 阅读 · 1 评论 -
算法与数据结构之带头结点的单链表
单链表的定义#include&amp;amp;amp;lt;stdio.h&amp;amp;amp;gt;#include&amp;amp;amp;lt;malloc.h&amp;amp;amp;gt;#include&amp;amp;amp;lt;stdlib.h&amp;amp;amp;gt;typedef struct Node{ int data; //数据域 struct原创 2019-01-01 20:28:15 · 2807 阅读 · 0 评论 -
算法与数据结构之集合和映射
集合(Set)集合:承载元素的容器,每个元素只能存在一次应用:客户统计,词汇量统计该集合所包含的操作:public interface Set<E> { void add(E e); void remove(E e); boolean contains(E e); int getSize(); boolean isEmpty();}基于二分搜索树的集合实现参考...原创 2019-05-17 18:16:15 · 198 阅读 · 0 评论