![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构
Cbird-coder
将这人工智障的时代拉回正轨
展开
-
简单查找算法之折半查找、插值查找、斐波那契查找
首先看折半查找,字面意思就能看出来是什么意思。定义三个“哨兵”,low,mid,high。其中mid=low+high/2,然后比较位置mid的元素与待查找元素的大小。如果key大于mid位置所对应的元素,则要查找的元素在数组的下半部分,重新为low赋值,low=mid+1;如果key小于mid位置对应的元素,则需要查找数组的上半部分,则high=mid-1。按照这样的规则在数组中遍历,找到待查找原创 2015-06-28 11:55:45 · 1738 阅读 · 0 评论 -
归并排序(Merge sort)
前面看了希尔排序与堆排序。比较而言希尔排序虽然将算法的复杂度从O(n*n)降了下来,但是极其不稳定算法复杂度再区间(O(n*logn)~O(n*n))波动。相比较希尔排序而言,堆排序算法解决了这个问题,可以将算法的复杂度稳定在O(n*logn),但是记录的比较与元素的交换是跳跃式进行的,也就是i层与下一层存在2倍关系,故而稳定性不是很好。归并排排序(Merge sort,算法导论里的第二个排序原创 2015-07-04 21:45:58 · 1195 阅读 · 0 评论 -
再谈hash函数
前面查看了一下一些经典的hash算法,要看看猛戳这里在前面查找算法里面都是需要遍历整个数据集,有没有一种方法直接可以将数据映射成一个唯一的地址,然后在进行查找的时候,直接通过映射关系一步到位就可以找到数据。这样的话就需要使用一种技术叫做散列技术,或许好多人都听过这个词儿hash。所谓的散列技术就是如前面所想的那样,记录的存储位置与关键字之间有一个确定的对应关系f,使得每个关键字key对应一原创 2015-06-29 20:35:00 · 515 阅读 · 0 评论 -
快速排序算法(Qsort)
或许在面试与笔试中问的最多的就是这个快速排序算法(Quick sort)。其实吧,这个快速排序的思想呢,很简单。所谓快速排序就是,起始的时候选择一个关键值key一般为数组的第一个值,然后将数组分割成两部分,前一部分全部小于key,后一部分全部大于key,然后前一部分与后一部分分别进行这样的分组,结束后所得的序列就是有序的。看吧思想炒鸡简单吧~但是实现呢?就有些纠结了,从上面的过程中可以原创 2015-07-11 00:16:57 · 1453 阅读 · 0 评论 -
二叉树的性质极其二叉树的构建、各种遍历以及深度宽度的求解
学了忘记,忘记了又来翻书。还是mark一下吧。是不是都会用到。性质1:二叉树的第i层上至多有2的i-1次方个节点。性质2:深度为n的二叉树至多有2的n-1次方个节点。性质3:对于任何一个二叉树,终端节点数为n0,度为2的节点为n2,那么n0=n2+1。性质4:具有n个节点的完全二叉树的深度为[log n]+1,这里的[ ]表示取整,不大于log n的最大整数。原创 2015-06-10 11:28:38 · 930 阅读 · 0 评论 -
平衡二叉树(AVL)
二叉排序树可以完美地生成一个二叉树,但是会有一种极端的情况。就是会生成一棵斜树,这种情况下,树的深度很大,会和节点数一样大。那么查找一个元素的算法复杂度达到O(n)。这种效率比较低,如果生成一棵类似于一棵完全二叉树,则树的深度为[log n]+1。那么查找的复杂度就将为O(log n)了。这里怎么生成这个平衡二叉树呢?这就需要在每次插入节点的时候先要对树形进行判断,看是否破坏了树的结构。树原创 2015-06-10 15:50:46 · 1049 阅读 · 0 评论 -
堆排序
在堆排序之前,首先得了解几个东西。首先是满二叉树:一个二叉树所有的分支节点都存在左子树与右子树,而且所有的叶子节点都在同一层上,则这个二叉树就是满二叉树。然后是完全二叉树:对一颗二叉树进行层序编号,如果编号为i的节点与同样深度的满二叉树中编号为i的节点的位置完全相同,则这个二叉树就是完全二叉树。第一个就是完全二叉树的性质。为了说明完全二叉的性质的时候,这里只写出层序符号。下面就是一颗完原创 2015-07-03 18:18:22 · 692 阅读 · 0 评论 -
插入排序的升级版之希尔排序
弄清楚插入排序之后,每次插入都是要遍历数组,比较插入较小元素到新数组。这样前三种插入算法的复杂度均为O(n*n)。希尔排序采用分组的思想,分组后,对组内元素进行插入排序处理。下面结合代码进行描述:void shellsort(int arr[],int length){ int i,j,k; int increasment=length; int temp; do { i原创 2015-07-03 17:38:37 · 631 阅读 · 0 评论 -
关于树的总结从二叉树->二叉搜索树->平衡二叉树->红黑树->B树与B+树
二叉树的定义与性质,包括各种操作的源代码在本博客的的此处:二叉树二叉搜索树(Binary Search Tree)的定义性质以及源码实现在本博客此处:二叉搜索树平衡二叉树(AVL树),是一棵完全二叉树(PS:关于满二叉树与完全二叉树可以在堆排序中看到定义),其性质以及源代码的实现在本博客此处:平衡二叉树红黑树,是花时间最久理解的一个东西,只理解了其中的原理,其应用最经典的及时本博客前面原创 2015-07-10 23:01:11 · 3337 阅读 · 0 评论 -
红黑树(Red-Black tree)(插入与删除操作)
前面讲了平衡二叉树(AVL),可以完美地实现将查找复杂度控制在O(logn)。但是AVL增加删除节点的时候,需要不断地判断左右树的高度差,这个频繁的操作降低了性能。为此提出了红黑树。什么样的树叫做红黑树呢?红黑树需要满足以下五个性质(摘自算法导论):1、每个节点不是红的就是黑的;2、根节点是黑的;3、每个叶子节点(也就是树的尾端NULL节点)是黑的;4、如果一个节点是红的,那么原创 2015-07-09 00:39:22 · 2282 阅读 · 0 评论 -
简单的排序算法(冒泡、选择、插入)
以下代码是这几种的C语言实现:#include#include#include#include#define ARR_LEN 1000void swapdata(int arr[],int i,int j){ int temp; temp=arr[i]; arr[i]=arr[j]; arr[j]=temp;}int bubble_rank1(int arr[原创 2015-07-01 00:30:02 · 490 阅读 · 0 评论 -
B树与B+树
二叉搜索树、平衡二叉树、红黑树都属于二叉树,由于每个节点只有一个元素,每个节点只能连接两个节点。对于像文件系统、数据库这样需要数目庞大读写删除操作,如果采用这种数据结构将会大大降低系统的效率,遇到I/O读写的瓶颈。有没有一种数据结构可以降低往返于节点之间的次数呢?答案是有的,就是B树。什么是叫B树呢?和二叉树有啥区别呢?了然于心二叉树的劣势,这个B树每个节点必然不是只是含有一个节点了,可以原创 2015-07-09 17:20:05 · 1524 阅读 · 0 评论 -
二叉搜索树(Binary Sort Tree)
在操作数据库的时候,经常进行大量的插入删除操作,我们希望达到的效果是能够对其中的某些元素操作,而不影响其他元素的位置,使表中的元素的移动达到最小,这里面一般使用的数据结构就是动态查找表。什么结构能够实现这样的效果呢?这里首先想到的是链表,对数据的组织形式选用最简单的树形结构。下面我们对二叉排序树进行讨论。二叉排序树一般具备以下几个特点:二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:(原创 2015-06-09 23:22:39 · 1033 阅读 · 0 评论 -
经典的字符串hash函数。
基本概念所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2)。设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m>=n,如果对于不同的key1,key2属于X,有h(key1)!=h(key2),那么称h为完美哈希函数,当m=n时,h称为最小完美哈希函数(这个时候就是一一映射了)。在处理大规模字转载 2015-06-29 17:20:05 · 720 阅读 · 0 评论 -
几个排序算法总结,从冒泡到快速排序
首先是排序的复杂度达到O(n*n)的几种算法,主要是冒泡、选择、插入这三种算法。实现的代码及其注释在本博客此处:简单排序算法研究算法的目的就是为了提高性能,所以想到能么降低算法的复杂度。首先是希尔排序是一种不稳定的排序算法,其复杂度取决于增量变量的选取,这里可以使得算法最好可以达到O(n*logn),最坏的情况就是O(n*n)。希尔排序完成了第一次突破,使得算法复杂度从O(n*n)降低下来原创 2015-07-12 12:01:59 · 576 阅读 · 0 评论