算法--数据结构
山西茄子
多媒体工程师,从事ffmpeg,gstreamer,视频编码,deepstream等开发,做做笔记。
展开
-
数据结构--图
各种图欧拉图 通过图(无向图或有向图)中所有边一次且仅一次行遍图中所有顶点的通路称为欧拉通路,通过图中所有边一次且仅一次行遍所有顶点的回路称为欧拉回路。具有欧拉回路的图称为欧拉图(Euler Graph),具有欧拉通路而无欧拉回路的图称为半欧拉图。汉密尔顿图 哈密顿通路(回路)与哈密顿图 (Hamilton图) 通过图G的每个结点一次,且仅一次的通路(回路),就是哈密顿通路(回路原创 2012-08-21 20:11:23 · 1121 阅读 · 0 评论 -
shell排序
shell排序法也运用到了直接插入排序法,因此重点讲下。算法原理原始的算法实现在最坏的情况下需要进行O(n2)的比较和交换。V. Pratt的书对算法进行了少量修改,可以使得性能提升至O(nlog2n)。这比最好的比较算法的O(nlogn)要差一些。希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步转载 2016-12-16 15:08:27 · 487 阅读 · 0 评论 -
堆排序
1.堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,满足Key[i]2.堆排序的思想 利用大顶堆(小顶堆)堆顶记录的是最转载 2016-10-31 20:57:02 · 357 阅读 · 0 评论 -
分析快速排序法
快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。不考虑效率的代码A如下:void QuickSort(int a[],int size){ if (size == 0 || size == 1) {原创 2014-04-15 13:41:57 · 672 阅读 · 0 评论 -
归并排序
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法转载 2016-12-22 23:35:38 · 393 阅读 · 0 评论 -
查找
二分法二分法时间复杂度:最坏O(logn),最好O(1)。[一维数组,折半查找]假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2.1.开始令front=0(指向3),end=7(指向88),则mid=3(指向36)。因为mid>x,故应在前半段中查转载 2016-12-24 21:10:46 · 515 阅读 · 0 评论 -
hash
处理冲突链地址法这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。例如,已知一组关键字(32,40,36,53,16,46,71,27,42,24,49,64),哈希表长度为13,哈希函数为:H(key)= key %转载 2015-06-11 10:53:10 · 666 阅读 · 0 评论 -
排序算法分析(复杂度,稳定性)
选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。冒泡法: 这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡: 复杂度为O(n*n)。当数据为正序,将不会有交换。复杂度为O(0)。直接插入排序:O(n*n)选择排序:O(n*n)快速排序:平均时间复杂度log2(n)*n,所有内转载 2012-08-16 20:25:25 · 1087 阅读 · 0 评论 -
单链表逆序测试
2、 单链表逆序 第二个题目是很经典的“单链表逆序”问题。很多公司的面试题库中都有这道题,有的公司明确题目要求不能使用额外的节点存储空间,有的没有明确说明,但是如果面试者使用了额外的节点存储空间做中转,会得到一个比较低的分数。如何在不使用额外存储节点的情况下使一个单链表的所有节点逆序?我们先用迭代循环的思想来分析这个问题,链表的初始状态如图(1)所示:图(1原创 2013-08-16 14:34:19 · 684 阅读 · 0 评论 -
二叉树的遍历
简单生成一个二叉树,可以测试前序,中序,后序遍历。// testbina.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include#include struct tree //声明树的结构{ int data; struct tree *left; struct原创 2013-05-13 07:38:07 · 809 阅读 · 0 评论 -
平衡二叉树
平衡二叉树简称平衡树,是由Adelson-Velskii和Landis于1962年首先提出的,所以又称为AVL树。他的定义很简单,就是若一棵二叉树的每个左右节点的高度差最多相差1,此二叉树即是平衡二叉树。把二叉树的每个节点的左子树减去右子树定义为该节点的平衡因子。二叉平衡树的平衡因子只能是1、0或者-1。 平衡二叉树是对二叉搜索树(又称为二叉排序树)的一种改进。二叉搜索树有一个缺转载 2016-10-30 17:47:02 · 634 阅读 · 0 评论 -
正则表达式
元字符. 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 \b 匹配单词的开始或结束 ^ 匹配字符串的开始 $ 匹配字符串的结束 重复* 重复零次或更多次 + 重复一次或更多次 ? 重复零次或一次 {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复n到m次 下面是一些使用转载 2013-01-08 15:16:40 · 1060 阅读 · 0 评论 -
最短路算法
Dijkstra算法算法步骤:a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则正常有权值,若u不是v的出边邻接点,则权值为∞。b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比转载 2016-10-28 10:01:25 · 510 阅读 · 0 评论 -
霍夫曼树
信息熵用这个公式衡量它的不确定性:f(p) = log(1/p) = -log(p);而信源的平均不确定性,称为信息熵,用下面的公式表示:H(U) = E[-log(pi)] = -Epi*log(pi)。注意:1. 当式中的对数的底为2时,信息熵的单位为比特。它底数为其它时,它对应的单位也不一样。 2. 信息熵是信息论中用于度量信息量的一个概念。一个系转载 2016-10-23 15:49:03 · 1130 阅读 · 0 评论 -
最小生成树
prim算法简单描述1).输入:一个加权连通图,其中顶点集合为V,边集合为E;2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;3).重复下列操作,直到Vnew = V:a.在集合E中选取权值最小的边,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之转载 2016-10-23 16:16:45 · 411 阅读 · 0 评论 -
数据结构--树
各种树二叉树 分左右子数,节点的度不超过2.满二叉树 除叶子结点外的所有结点均有两个子结点。完全二叉树完全二叉树是由满二叉树而引出来的,若设二叉树的高度为h,除第 h层外,其它各层 (1~h-1)的结点数都达到最大个数,第 h 层从右向左连续缺若干结点,这就是完全二叉树。 平衡二叉树它是一棵空树或它的左右两个子树的高度差的绝对值原创 2012-08-21 20:09:42 · 1216 阅读 · 0 评论 -
字符串
字符串拷贝char* str_cp(char* pd,char*ps){ if (pd ==NULL||ps == NULL) { return NULL; } char*p = pd; char*p1 = pd; char*p2 =ps; while((*p1++ = *p2++)!=NULL) { }; return p;}int原创 2013-08-26 17:22:52 · 545 阅读 · 0 评论 -
堆与栈
这里面有几个问题:1.堆和栈最大可分配的内存的大小2.堆和栈的内存管理方式3.堆和栈的分配效率首先针对第一个问题,一般来说对于一个进程栈的大小远远小于堆的大小,在linux中,你可以使用ulimit -s (单位kb)来查看一个进程栈的最大可分配大小,一般来说不超过8M,有的甚至不超过2M,不过这个可以设置,而对于堆你会发现,针对一个进程堆的最大可分配的大小在G的数量级上,不同系统转载 2016-03-10 09:37:05 · 420 阅读 · 0 评论 -
汇编语言的所有指令
32位的CPU一次就能处理4个字节,同理,字长为64位的CPU一次可以处理8个字节。memcpy会按系统字长进行对齐优化。比如32bit系统上4字节4字节操作,64bit系统上8字节8字节操作。如果你的循环中也是按对齐赋值的,就没有区别,如果你的赋值不是对齐,比如是char类型赋值,memcpy会快一些。1、数据传送指令集MOV功能: 把源操作数送给目的操作数语法: MOV 目的...转载 2019-01-01 21:10:14 · 2242 阅读 · 1 评论