
算法导论
文章平均质量分 80
jun2016425
coolnqjun@163.com
展开
-
二分查找
二分查找介绍于已经排好序的数组A进行二分查找。二分查找又可以写成两种子形式(就目前我的水平知道的,日后知道其他再更新吧),一种是递归形式的,一种是迭代的形式。据说所有的递归都可以写成迭代的形式。迭代二分查找伪代码interative_binary_search(A, V, low, high)while low <= high mid = (low + high)/2 i原创 2016-12-31 12:47:29 · 421 阅读 · 0 评论 -
快速排序
快速排序简介对于包含n个数的输入数组来说,虽然快速排序是一种最坏情况实际复杂度为Θ(n2)\varTheta(n^2)的排序算法, 但它的平均性能非常好: (1)它的期望时间复杂度是 Θ(nlgn)\varTheta(nlgn) ,而且 (2) Θ(nlgn)\varTheta(nlgn) 中隐含的常数因子非常小. (3) 它还能进行原址排序. 快排目前公认的排序算法里面实际应用中最快的最好的最常原创 2017-03-19 12:57:45 · 427 阅读 · 0 评论 -
红黑树
什么是红黑树红黑树是特殊的二叉搜索树,它比二叉搜索树多了一点颜色. 红黑树的五个性质: 1. 每一个结点要么是红色,要么是黑色 2. 根结点必须是黑色 3. 每个叶子结点(NIL)为黑色 4. 如果一个结点是红色,那么它的两个孩子结点都为黑色 5. 对于每个结点,从该结点到其所有后代叶子结点的简单路径上,均包含相同数目的黑色结点红黑树的结构体如下: 至少包含:color, key,原创 2017-07-20 18:25:43 · 382 阅读 · 0 评论 -
二叉搜索树(遍历不递归,不用栈)
什么是二叉搜索树一棵二叉搜索树是以一棵二叉树来组织的,如下图: 这样的一棵树可以使用一个链表数据结构来表示,其中每个结点就是一个对象。除了key和卫星数据之外,每个结点还包含属性left, right 和 parent, 它们分别指向左孩子,右孩子和双亲。比如:typeof struct node{ int key; // other data... 即卫星数据 str原创 2017-07-03 23:28:51 · 1577 阅读 · 0 评论 -
hlist内核哈希链表应用-解决散列表表的冲突问题
散列表我们都知道在散列函数(如h)将关键字映射到散列表的槽中,关键字k2k_2和k5k_5映射到一个槽中,因而产生冲突,如图1: (图1) 有问题就有解决的办法,这里的解决办法就是链接法(chaining),链接法是怎么样的呢,如图2: (图2) 那么图2这个链接法是怎么建立的呢,我用的是C语言,借鉴的是Linux内核的哈希函数:例子:将关键字 5, 28, 19, 15, 20,原创 2017-07-02 00:13:17 · 498 阅读 · 0 评论 -
散列表
直接寻址表当关键字的全域U比较小时,直接寻址是一种简单而有效的技术。 另外,假设没有两个元素具有相同的关键字. 如图: 几个字典的操作实现比较简单: DIRECT_ADDRESS_SEARCH(T, k) return T[k]DIRECT_ADDRESS_INSERT(T, x) T[x.key] = xDIRECT_ADDRESS_DELETE(T, x) T[x.原创 2017-06-18 23:21:29 · 236 阅读 · 0 评论 -
栈和队列
栈和队列都是动态集合,且在其上进行DELETE操作所移除的元素都是预先设定的。 在栈stack中,被删除的是最近插入的元素:栈实现的是一种后进先出(last-in, first-out, LIFO)策略。 在队列(queue)中,被删去的总是在集合中存在时间最长的那个元素:队列实现的是一种先进先出(first-in, first-out, FIFO)策略。简单的数组实现栈和队列.原创 2017-05-07 21:52:18 · 1268 阅读 · 0 评论 -
任意有根树遍历
左孩子右兄弟的存储方式typedef struct tree_node{ ElemType data; tree_node *left_child; tree_node *right_sibling;} tree_node, *ptree_node;先根遍历 PREORDER(T)if T == NIL return NILprint(T)for p = T.原创 2017-05-31 11:47:06 · 425 阅读 · 0 评论 -
二叉树遍历
二叉链表typedef struct Node{ ElemType data; struct Node *lchild, *rchild; }Binode, *Bitree;注意点: 1)已知 前序遍历序列 和 中序遍历序列,可以唯一确定一颗二叉树 2)已知 中序遍历序列和 后序遍历序列,可以唯一确定一颗二叉树 而已知 前序和后序 是不能确定一颗二叉树的二叉树的遍历:原创 2017-05-27 17:25:52 · 436 阅读 · 0 评论 -
堆排序
堆排序的时间复杂度是O(nlgn)O(nlgn),堆排序具有空间原址性,任何时候都只需要常数个额外的元素空间存储临时数据。堆的介绍(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树。树上的每一个结点对应数组中的一个元素。除了最底层外,该树是完全充满的,而且从左向右填充。如下图: 表示堆数组A包括两个属性:A.length通常给出数组元素的个数,A.heap-size表示有多少个堆元素存储在该数原创 2017-04-02 23:09:50 · 354 阅读 · 0 评论 -
矩阵乘法的Strassen算法
若A=(aij)A=(a_{ij})和B=(bij)B=(b_{ij})是n∗nn*n方阵,则对于i,j=1,2,…,n;定义乘积C = A * B中的元素cijc_{ij}为: cij=∑k=1naikbkjc_{ij}= \sum_{k=1}^{n} a_{ik}b_{kj} 我们需要计算n2n^2个矩阵元素,每个元素是n个值的和。下面过程接收n*n矩阵A和B,返回它们的乘积 n* n矩阵原创 2017-01-13 09:28:35 · 2661 阅读 · 0 评论 -
归并排序
概念归并排序是属于分治算法。 许多有用的算法在结构上是递归的:为了解决一个给定的问题,算法一次或多次递归地调用其自身以解决机密相关的若干子 问题。这些算法典型地遵循分治法的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题, 然后再合并这些子问题的解来建立原问题的解。 分治模式在递归时都要三个步骤: 分解原问题为若子问题,这些子问题是原问题的规模较小的实例。 解原创 2017-01-19 11:53:43 · 1755 阅读 · 0 评论 -
最大子数组问题
最大子数组问题一个数组如: 求解该数组内的一个子数组,该数组的元素属于A[ ],且元素是连续的,且子数组元素的和为A[]内所有子数组中最大的,则该数组为连续数组的最大子数组。暴力求解方法暴力求法,就是一个个的去遍历组合时间 为:T(n)=Θ(n2).T(n) = Θ( n^2 ). 使用分治策略的求解方法但是我们想要更短的时间求解最大子数组问题.那么它就是使用分治策略的求解方法。 使用分治策原创 2017-01-08 19:40:57 · 467 阅读 · 0 评论 -
选择排序
算法导论中练习题2.2-2考虑排序储存在数组A中的n个数:首先找出A中的最小元素并将其与A[1]中的元素进行交换。接着,找出A中的次小元素将其与A[2]中元素进行交换。对A中前n-1个元素按该方式继续。该算法为选择排序。写出起伪代码英文版(考虑到可能翻译的不到位,所以把英文原文贴上):Consider sorting n numbers stored in array原创 2016-12-25 14:58:18 · 469 阅读 · 0 评论 -
线性查找
算法导论练习题2.1-3考虑如下查找问题:输入:n个数的一个序列 A = {a1, a2, ..., an} 和一个值 V.输出:下标 i 使得 V = A[ i ] 或者 当 V 不在 A 中出现时,V 为特殊值 NIL.我的线性伪代码如下:n = A.lengthfor i=1 to n if(v==A[i]) return i i = i + 1return原创 2016-12-23 00:27:12 · 752 阅读 · 0 评论 -
插入排序及插入排序改进
插入排序,在算法导论里面的介绍对数组原创 2016-11-07 00:03:35 · 405 阅读 · 0 评论 -
快速排序算法C语言
快速排序算法,附带加快理解快速排序算法思想的视频链接,建议先看视频,再看代码原创 2016-07-18 15:53:33 · 634 阅读 · 0 评论