【数据结构与算法】
文章平均质量分 63
吾之求索
https://github.com/Small-Cube
展开
-
数据结构之单链表实现
用两个月的时间好好把数据结构复习一遍,都算不上复习了,最后的图的方面完全是新学,希望能坚持下去。一、单链表 链表相比较于数组更为灵活,存储方式是链式的,插入删除操作优于数组,但是查询操作优于数组。还是不多介绍了直接上代码吧。(代码参考数据结构与算法分析-c语言版本)//头文件#ifndef LIST_H#define LIST_Hstruct Node;tydedef struct ...原创 2018-05-27 17:15:42 · 232 阅读 · 0 评论 -
算法分析-----动态规划
动态规划 动态规划算法与分治法类似,基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是适合用动态规划的问题,经分解的子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,以至于最后解决问题需要耗费指数时间。然而,不同子问题的数目往往只有多项式量级。在用分治法求解时,有的子问题会被重复计算很多次,如...原创 2018-12-03 19:22:21 · 524 阅读 · 0 评论 -
算法分析-----递归与分治策略
1、递归的概念 直接或间接的调用自身的算法成为递归算法。用函数自身给出定义的函数称为递归函数。 例1:阶乘函数 int factorial(int n){ if(n==0) return 0; return n*factorial(n-1);} 例2:Fibonacci数列 int Fibona...原创 2018-11-22 18:48:31 · 408 阅读 · 0 评论 -
排序----快速排序
/********采用三数中值法选区枢纽元****在数据小于一定值时采用插入排序可以实现更高效率的排序********************/#include <iostream>#define cutoff 3/* run this program using the console pauser or add your own getch, system("...原创 2018-11-27 20:41:46 · 158 阅读 · 0 评论 -
排序-----归并排序
/*归并排序是利用归并的思想,采用分治策略,将问题分为一些小问题然后递归求解。在治阶段将分阶段得到****的各答案合在一起。比如一个{8,4,5,7,1,3,6,2}的数列分成{8,4,5,7}和{1,3,6,2}之后****再分成{8,4},{5,7},{1,3},{6,2}再分成{8}{4}{5}{7}{1}{3}{6}{2},然后开始比较先比较8,4****小的放前面之后合并,{4,8...原创 2018-11-27 20:41:07 · 106 阅读 · 0 评论 -
排序---希尔(shell)排序
希尔排序其实是改进版的插入排序,但是它是不稳定的。它的做法是使用一个增量使元素每次相隔增量的元素都被排序。增量最后一次的值为1。也就是对所有的元素进行一次插入排序。增量的选择当然是比较困难的。所幸有经验知识可以参考。 为了让排序算法有更好的鲁棒性,我们将所有排序算法的参数都设置为一个带排序的数组以及数组的大小。实现代码如下://希尔排序是插入排序的一种改进的算法,...原创 2018-08-01 19:00:47 · 243 阅读 · 0 评论 -
排序--插入排序
首先推荐这篇文章https://blog.csdn.net/qq_19782019/article/details/78021705,很明白的写出了两种排序算法的差距,更对两种不同插入排序的性能进行了分析。插入排序的思想是,一共N个数据,需要进行N-1趟排序组成。对从1到N-1趟,插入排序保证从位置0到位置P上的元素为已排序的状态。起初我们设置1为起始位置,也就是第一趟保证0-1的元素...原创 2018-07-30 19:48:34 · 114 阅读 · 0 评论 -
树--AVL平衡树
1、AVL平衡树 AVL 平衡树是带有平衡条件的二叉查找树。保证树的深度深度是O(logN),定义一个不平衡的节点的定义是,他的左右子树高度差是2. 当插入一个节点之后,树可能不平衡,假设这个不平衡点是K1,造成这种不平衡的原因可能有以下四个情况: (1)对K1的左儿子的左子树进行插入。 (2)对K1的左儿子的右子树进行插入。 ...原创 2018-07-13 21:37:08 · 217 阅读 · 0 评论 -
树--四种遍历
1、四种遍历概念 (1)先序遍历:先访问根节点,再访问左子树,最后访问右子树。 (2) 后序遍历:先左子树,再右子树,最后根节点。 (3)中序遍历:先左子树,再根节点,最后右子树。 (4)层序遍历:每一层从左到右访问每一个节点。 每一个子树遍历时依然按照此时的遍历顺序。如下图: 先序遍历:FCADBEHGM 后序遍历:A...原创 2018-07-12 10:59:04 · 54110 阅读 · 2 评论 -
优先队列--堆
实现优先队列可以有好几种方法,但是最经常使用的是二叉堆,甚至于堆这个词一般都是指优先队列这种数据结构。堆应该有两种性质,结构性和堆序性。 1、 结构性 堆是一颗完全填满的二叉树,有例外的是最底层,底层元素是从左到右填入。一颗高为H的完全二叉树有2^h到2^(h+1)-1个节点。任意一个位置 i 的元素,左儿子在 2i 的位置,右儿子在 2i+1 的...原创 2018-07-23 17:32:42 · 184 阅读 · 0 评论 -
树--二叉树
1、二叉树二叉树是一颗树。其中每个节点不能有多于两个的儿子。二叉树的单节点实现:typedef struct TreeNode *PtrToNode;typedef struct PtrToNode Tree;struct TreeNode{ ElementType Element; Tree left; Tree right;}2、二叉查找树 二叉树的一个重要应用就是他...原创 2018-07-11 17:52:49 · 139 阅读 · 0 评论 -
散列(Hash)表
哈希表的作用是用来实现高效的查找,相比较数组、链表等更加高效。通过关键字和值的一一对应来实现。和C++的关联容器有点像,但是map内部实现是通过红黑树来实现的。相对于而二叉查找树,散列表只支持其中的一部分操作。散列是一种用以常数平均时间执行插入、删除、和查找的技术。 哈希表的实现主要涉及两个方面,一是哈希函数的确定,二是解决经过哈希函数之后存在的冲突问题。 ...原创 2018-07-16 15:39:52 · 324 阅读 · 0 评论 -
数据结构之队列
队列是一种FIFO(先入先出)的数据结构。队列只允许在队首进行删除操作,在队尾进行插入操作,队列在网络任务、消息队列、排队等情况下运用很多。现实生活中很多情况下都是消息队列的体现。比如售票口排队买票、银行等待呼叫队列等。#ifndef QUEUE_H#define QUEUE_H//使用指针实现队列struct QueueNode;typedef QueueNode *...原创 2018-05-30 23:58:42 · 210 阅读 · 0 评论 -
数据结构之堆栈
堆栈如同前面的链表一样,也是线性结构。也可以用数组和链表两种方式来实现。堆栈遵循FILO(先入后出),主要操作包括入栈、出栈,等同于链表的插入和删除,不同的是链表可以在任意地方进行插入删除操作而堆栈的入栈和出栈相当于在链表的头节点处进行插入和删除操作。还是直接贴代码。#ifndef STACK_H#define STACK_Hstruct Node;typedef Node *PtrToNo...原创 2018-05-29 17:41:59 · 200 阅读 · 0 评论 -
数据结构之双向链表
之前学习数据结构并没有注意过双链表的问题。现在专门拿出来学习一下。首先推荐点击打开链接这篇文章。讲得很好,专门以linux内核中的数据结构为例讲述了双向链表在内核中的应用。最主要的还是删除和插入操作,这两个搞明白了基本也差不多了。我还是不多废话直接贴代码吧。...原创 2018-05-28 22:03:38 · 243 阅读 · 0 评论 -
动态规划-----最长公共子序列
具体思想可以参考这篇文章,很详细。(https://blog.csdn.net/hrn1216/article/details/51534607)#include<iostream>#include<string.h>using namespace std;/*给定两个序列X,Y,当另一个序列Z既是X的子序列也是Y的子序列时,称Z为X,Y的公共子序列。求...原创 2018-12-13 09:11:55 · 176 阅读 · 0 评论