数据结构与算法
C、C++语言深入理解剖析数据结构与算法
askunix_hjh
这个作者很懒,什么都没留下…
展开
-
散列函数(哈希)
概念散列的概念属于查找,它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,查找的期望时间为O(1)。hash函数就是把任意长的输入字符串变化成固定长的输出字符串的一种函数。输出字符串的长度称为hash函数的位数。散列(Hashing)通过散列函数将要检索的项与索引(散列,散列值)关联起来,生成一种便于搜索的数据结构(散列表)。应用目前应用最为广泛的hash函数是SH...原创 2018-08-24 12:01:00 · 31799 阅读 · 3 评论 -
优先级队列概念(Priority Queue)
概念☺优先队列是一种用来维护一组元素构成的结合S的数据结构,其中每个元素都有一个关键字key,元素之间的比较都是通过key来比较的。优先队列包括最大优先队列和最小优先队列,优先队列的应用比较广泛,比如作业系统中的调度程序,当一个作业完成后,需要在所有等待调度的作业中选择一个优先级最高的作业来执行,并且也可以添加一个新的作业到作业的优先队列中。 优先队列的实现中,我们可以选择堆数据结构,最...原创 2018-08-21 23:45:57 · 6729 阅读 · 0 评论 -
【Huffman】哈夫曼树与哈夫曼编码
基本概念1、路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。2、结点的权及带权路径长度 若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。3、树的带权路径长...原创 2018-08-16 00:53:20 · 407 阅读 · 0 评论 -
查找算法总结
顺序查找 最简单的遍历查找。时间复杂度比较大,属于无序查找。二分查找 也叫作折半查找。属于有序查找,如果查找之前数据无序,就要先排序。 复杂度分析:最坏情况下,关键词比较次数为log2(n+1),且期望时间复杂度为O(log2n);//二分查找,递归版本int BinarySearch(int *arr, int k, int low, int high)...原创 2018-08-12 23:17:00 · 867 阅读 · 0 评论 -
【排序算法】希尔排序(缩小增量排序)
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。基本思想:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情...原创 2018-08-11 00:55:17 · 1036 阅读 · 0 评论 -
【笔试题】删除有序链表中的重复节点
题目描述: 一个有序链表:1 → 3 → 4 → 4 → 5 → 6 → 6 → 8,删除有序链表后得到:1 → 3 → 4 → 5 → 6 → 8。请实现该功能,并返回链表的头指针。思路分析:1.设置3个工作指针,pre=L,cur=L->next,re=L,cur指向当前指针,pre指向当前节点的前继节点,re指向迭代过程中添加节点的位置。2.迭代比较cu...原创 2018-08-02 18:54:29 · 2614 阅读 · 0 评论 -
【栈的应用】迷宫算法(栈和回溯思想)
人生,就像一个很大的栈演变。出生时赤条条地来到这个世界,慢慢地长大,渐渐地变老,最终还得赤条条地离开世间。思路分析: 上面是一个迷宫地图,在地图上,0 代表墙,1 代表通路。迷宫是回溯法和栈的综合应用。下面给出完整的思路和寻路算法: 这里我们只研究一种情况:地图只有一条路径可以出去。 寻路算法按照上下左右的顺序进行遍历和判断。从入口出发,按照上...原创 2018-07-31 00:35:04 · 4147 阅读 · 1 评论 -
顺序栈
一:基本概念1、栈的功能:从某种数据元素序列得到另一种数据元素序列的改变。 2、特点:先进后出 3、栈的其他存储形式:链栈、共享栈 4、栈内存:栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释原创 2018-03-23 21:31:43 · 1125 阅读 · 0 评论 -
【面试题】两个有序链表的合并问题
题目描述: 给定两个无头有序单链表(都是从小到大的顺序排列),请合并为一个链表,使新链表也有序。 pHead1:-2、3、9、10 pHead2:2、5、9 pNewHead:-2、2、3、5、9、9、10 题目分析: 这道题目很重点,所以分析会在代码注释中体现。 如果面试过程中被提问,要明确是带头单链表,还是不带头结点单链表。 方法...原创 2018-05-23 20:07:43 · 1222 阅读 · 0 评论 -
【面试题】返回链表倒数第K个节点
题目描述:输入一个链表,返回链表倒数第K个节点。实现过程:#include<stdio.h>#include<stdlib.h>#include<assert.h>#define DataType inttypedef struct Node{ DataType data; struct Node* _pNext;...原创 2018-06-06 22:48:29 · 1272 阅读 · 0 评论 -
二叉树的层序遍历(两种方法实现)
两种方法实现二叉树的层序遍历1、说明二叉树的层序遍历是面试经常会被考察的知识点,甚至要求当场写出实现过程。层序遍历所要解决的问题很好理解,就是按二叉树从上到下,从左到右依次打印每个节点中存储的数据。如下图: 先序遍历:A → B → D → C 中序遍历:B → D → A → C 后续遍历:D → B → C → A 层序遍历:A → B → C →...原创 2018-06-24 23:51:59 · 140916 阅读 · 19 评论 -
堆排序-C语言实现
描述:堆排序就是利用堆这种数据结构进行排序的算法,堆排序属于选择排序。 堆是一棵顺序存储的完全二叉树 堆排序的时间复杂度: O(nlogn),属于不稳定排序。 大根堆 小根堆 每个节点的值大于等于孩子节点得堆 每个节点得值小于等于孩子节点得值堆的存储结构:以上结构,设当前元素在数组中以R[i]表示,那么,(1) 它的左孩子结点...原创 2018-06-27 00:49:03 · 11498 阅读 · 2 评论 -
贪心算法解决问题
描述:贪心算法也叫作贪婪算法,是指在求解问题时总做出在当前看来最好的选择,就是不从整体考虑问题,仅在某种意义上的局部最优解。虽然不是所有问题都能得到最优解,但是面对范围广泛的许多问题时,能产生整体最优解或者是整体最优解的近似值。贪心算法思路:从问题的某一个初始解出发,逐步逼近给定的目标,以便更快的求出更好的解。当达到算法中某一步不能再向前时,就停止算法,给出一个近似解。缺点:(...原创 2018-07-15 23:43:32 · 6020 阅读 · 0 评论 -
【排序算法】快速排序(可视化描述,实现方法,代码优化)
这是快排的可视化动态图描述:该方法的基本思想是:(1)选择基准:在待排序列中,按照某种方式挑出一个元素,作为 “基准”;(2)分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大;(3)递归地对两个序列进行快速排序,直到序列为空或者只有一个元素。总结起来就是:挖坑思想 + 分治思想对于分治思想,当...原创 2018-07-17 16:40:30 · 4095 阅读 · 0 评论 -
【排序算法】直接插入排序 & 折半插入排序(二分法插入排序)
排序算法的性能评估:一个算法执行时间是衡量算法好坏的重要参数。排序算法的时间开销可用算法中的数据交换次数,和数据移动次数来衡量。直接插入排序算法算法思想:当插入第 i 个元素时,前面的 i-1 个元素已经有序。其实直接插入排序就是拿一个数,放到前面有序的数中就可以了。具体怎么放,不管是循环交换两个数的位置,还是先找到位置,再将该位置后面的数顺移,都没毛病的。 算法...原创 2018-07-30 00:30:59 · 2541 阅读 · 0 评论 -
C++~无头单链表基础操作
单链表是一种数据存储结构,是一种链式存储的线性表,用一组任意的存储单元存放线性表的元素,称存储单元为一个节点。 1.单链表结构:typedef int DataType; //int类型重命名typedef struct Node{ DataType data; struct Node* pNext;}Node, *PNode; /原创 2017-10-09 22:41:36 · 762 阅读 · 0 评论 -
排序算法——冒泡排序
之前我写过一个博客是对字符数组、整型数组以及结构体的排序:点击打开博客今天用模板方式写了通用冒泡排序,附上代码如下:#includeusing namespace std;//冒泡排序法templatevoid bubble_sort(T *arr,const int len){ for (int i = 0; i < len; i++) { for (int j = 0;原创 2017-11-26 10:36:07 · 366 阅读 · 0 评论