数据结构与算法
文章平均质量分 79
学习数据结构和算法导论的心得总结
weiers
逝去了青春至少还留下了代码
展开
-
排序算法学习总结
排序算法学习总结排序算法在经典算法里面是非常重要的,于是花了点时间将之前学习的常见的排序算法进行总结。对于每种排序算法,需要理解以下问题:1.算法思想是什么2.时间复杂度3.稳定性4.什么情况下适用?基于比较的排序,已证明,基于比较的排序算法时间复杂度不会低于O(nlgn)最好的情况能达到这个下限,包括:插入排序/希尔排序/选择排序/堆排序/冒泡排序/归原创 2015-11-20 16:09:44 · 2030 阅读 · 5 评论 -
【算法】桶排序
桶排序桶排序(Bucket Sort)假设输入数据服从均匀分布,然后将输入数据均匀地分配到有限数量的桶中,然后对每个桶再分别排序,对每个桶再使用其他的排序算法,最后将每个桶中的数据有序的组合起来。前面了解到基数排序假设输入数据属于一个小区间内的整数,而桶排序则是假设输入是由一个随机过程生成,该过程将元素均匀的分布在一个区间[a,b]上。由于桶排序和计数排序一样均对输入的数据进行了某些假设限制,原创 2015-11-19 13:18:59 · 11251 阅读 · 1 评论 -
【算法】希尔排序
希尔排序希尔排序(Shell Sort)是插入排序的一种更高效的改进版本。他是通过比较相距一定间隔的元素来工作,各趟比较所用距离随着算法的进行而减小,直至只比较相邻元素的最后一趟排序,因此也称递减增量排序算法。直接插入排序在当序列恰好为顺序时,时间消耗为O(n),因此若某个序列已基本有序,直接插入排序的效率就会提高。希尔排序使用一个序列h1,h2...ht的增量序列,只要h1=1,任何原创 2015-11-19 13:18:38 · 1497 阅读 · 0 评论 -
【数据结构】平衡二叉树之AVL树
平衡二叉排序树平衡二叉排序树(Balanced Binary Sort Tree),上一篇博客【数据结构】二叉排序树BST讲了BST,并且在最后我们说BST上的操作不会超过O(h),既然树高这么重要,那么BBST的研究就是为了使得树的深度在可接受的范围内渐近意义下达到O(lgn)n个节点组成的二叉树,其高度为lgn取下限时,这棵树是理想平衡的,满足这样条件的树只有完全二叉树和满二叉树,这样原创 2015-11-16 19:57:12 · 3513 阅读 · 0 评论 -
【数据结构】二叉排序树BST
二叉排序树二叉排序树(Binary Sort Tree)也叫二叉搜索树(Binary Search Tree)二叉排序树本质上还是一个二叉树,只不过在其上定义了一些规则:一个结点的左子树中所有的结点不大于该结点的值,而其右子树中的所有结点不小于该结点的值。由此规则可得BST中序遍历是有序的。BST中定义的操作有:minNode:某个子树中的关键字最小的结点maxNode:某个子原创 2015-11-14 11:20:21 · 2714 阅读 · 0 评论 -
【数据结构】二叉树
前言数据结构还是大二的时候学过的,当然由于是非计算机专业的学生,所以学的也不怎么样,去年用c++实现了最基本的数据结构,链表/栈/队列/二叉树,三月份看的时候还贴到了博客上。然而当时由于代码量不够,其实写的并不是很好,理解也太不到位。最近在看算法导论,当然最基本的就是数据结构,于是打算将基本的知识在回顾一下。我是一个疯狂的人,一旦决定做一件事,就会全天埋头去干,因为总有一种恨不得赶快学原创 2015-11-13 19:01:51 · 3155 阅读 · 5 评论 -
【算法】堆排序
堆排序上一篇博客讲了堆这种数据结构,它提供了一种接口getMax接口,好消息是获得最大值的时间复杂度仅仅为O(1),删除最大值delMax也仅仅需要O(lgn)的时间(删除后需要调整至满足堆的性质需要O(lgn)),因此联想到之前的选择排序算法,每次从剩下的未排序元素中找到极值元素,将其放入对应的位置。由于一般的选择排序在寻找最大值时需要遍历数组,遍历数组的复杂度为O(n),因此造成了时间原创 2015-11-12 12:45:35 · 223 阅读 · 0 评论 -
【数据结构】堆
堆这种数据结构。一般堆用来实现优先级队列。优先级队列:和通常的栈和队列一样,只不过里面的每个元素都有一个“优先级”,在处理的时候,首先处理优先级最高的。通常包含三个操作getMax/delMax/insert栈和队列算是优先级队列的特例。使用其他数据结构均不能同时在O(lgn)的复杂度下完成。至少有一种操作要耗时O(n).比如链表的插入操作O(1),但是获取最大值必须遍历链表O(N)。原创 2015-11-12 10:27:37 · 2196 阅读 · 0 评论 -
【算法】基数排序
计数排序学习基数排序之前首先学习计数排序。计数排序假设每个元素都是在0到k之间的一个整数。基数排序的基本思想,对于每个元素x,如果我们知道了小于x的元素的个数,就可以确定输出数组中元素x的位置,那么直接将元素x放到输出数组中。比如有3小于x的元素,那在输出数组中,x肯定位于第4个位置。计数排序的算法用伪代码描述为:COUNTING-SORT(A,k) // 初始化数组C原创 2015-11-11 15:01:47 · 4303 阅读 · 0 评论 -
【算法】快速排序/数组第K小的元素
快速排序和归并排序一样,也是采用分治(Divide and Conquer)思想。分为三步:分解:将数组A[p...q]划分成两个数组A[p..r-1]和A[r+1..q],使得A[p..r-1]中的每个元素都小于等于A[r],并且A[r+1..q]中所有元素大于等于A[r],A[r]称为主元。解决:递归调用快速排序,对两个子数组进行排序合并:不需要合并操作,子数组采用原址排序,已原创 2015-11-10 23:04:18 · 4982 阅读 · 0 评论 -
【算法】归并排序
归并排序采用分治(Divide and Conquer)思想。主要思想:将数组分成两部分,如果这两部分均有序,那么便可在O(n)的时间内合并成一个完整的有序数组。以此类推将区间划分下去,直到每个区间只有一个元素,即可认为已经有序,然后两两合并。T(n)=T(n/2)+O(n) 其中O(n)是合并两个有序数组产生的。求解递归式可得归并排序的时间复杂度为T(n)=原创 2015-11-10 21:10:47 · 1625 阅读 · 0 评论 -
【算法】插入排序/冒泡排序/选择排序
插入排序插入排序的思想为:从数组的第二个元素开始遍历整个数组。针对每个元素,依次将其前面的所有元素和他进行比较,大于它的元素均向后移动,最后将该元素插入。插入排序是一种稳定的排序算法。时间复杂度T(n)=O(n^2)最好情况下已排好序,T(n)=O(n)private void swap(int[] a, int i, int j) { int temp = a[j];原创 2015-11-10 20:33:52 · 2489 阅读 · 1 评论