<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Cauma_分类_数据结构与算法</title><id>http://feed.cnblogs.com/blog/u/40693/category/207778/rss</id><updated>2012-05-29T22:33:58Z</updated><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedream2009/category/207778.html"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/40693/category/207778/rss"/><entry><id>http://www.cnblogs.com/bluedream2009/archive/2011/04/28/2031260.html</id><title type="text">【思维】中位数与顺序统计</title><summary type="text">算法定义在统计学中，中值（又称中位数）代表一个样本、种群或概率分布中的一个数值，其可将数值集合划分为相等的上下两部分。对于有限的数集，可以通过把所有观察值高低排序后找出正中间的一个作为中值。如果观察值有偶数个，则中值不唯一，通常取最中间的两个数值的平均数作为中值。一个数集中最多有一半的数值小于中值，也最多有一半的数值大于中值。如果大于和小于中值的数值个数均少于一半，那麽数集中必有若干值等同于中值。设连续随机变量X的分布函数为F(X)，那么满足条件P(X≤m)=F(m)=1/2的数称为X或分布F的中位数。对于一组有限个数的数据来说，它们的中位数是这样的一种数：这群数据里的一半的数据比它大，而另外</summary><published>2011-04-27T16:08:00Z</published><updated>2011-04-27T16:08:00Z</updated><author><name>BlueDream</name><uri>http://www.cnblogs.com/bluedream2009/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedream2009/archive/2011/04/28/2031260.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedream2009/archive/2011/04/28/2031260.html"/><content type="html"/></entry><entry><id>http://www.cnblogs.com/bluedream2009/archive/2011/04/17/2019227.html</id><title type="text">【思维】基数排序</title><summary type="text">算法定义基数排序(Radix sort)是一种排序算法，它是这样实现的：将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零. 然后, 从最低位开始, 依次进行一次排序.这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列.基数排序的方式可以采用LSD（Least significant digital）或MSD（Most significant digital），LSD的排序方式由键值的最右边开始，而MSD则相反，由键值的最左边开始。算法描述基数排序的简单描述就是将数字拆分为个位十位百位，每个位依次排序。因为这对算法稳定要求高。所以我们对数位排序用到上一个排序方</summary><published>2011-04-17T15:35:00Z</published><updated>2011-04-17T15:35:00Z</updated><author><name>BlueDream</name><uri>http://www.cnblogs.com/bluedream2009/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedream2009/archive/2011/04/17/2019227.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedream2009/archive/2011/04/17/2019227.html"/><content type="html"/></entry><entry><id>http://www.cnblogs.com/bluedream2009/archive/2011/04/14/2016551.html</id><title type="text">【思维】计数排序</title><summary type="text">算法定义计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C，其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。当输入的元素是 n 个 0 到 k 之间的整数时，它的运行时间是 Θ(n+k)。计数排序不是比较排序，排序的速度快于任何比较排序算法。由于用来计数的数组C的长度取决于待排序数组中数据的范围（等于待排序数组的最大值与最小值的差加上1），这使得计数排序对于数据范围很大的数组，需要大量时间和内存。例如：计数排序是用来排序0到100之间的数字的最好的算法，但是它不适合按字母顺序排序人名。但是，计数排序可以用在基</summary><published>2011-04-14T15:10:00Z</published><updated>2011-04-14T15:10:00Z</updated><author><name>BlueDream</name><uri>http://www.cnblogs.com/bluedream2009/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedream2009/archive/2011/04/14/2016551.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedream2009/archive/2011/04/14/2016551.html"/><content type="html"/></entry><entry><id>http://www.cnblogs.com/bluedream2009/archive/2011/04/14/2015527.html</id><title type="text">【思维】快速排序</title><summary type="text">算法定义快速排序是一种排序算法，由C. A. R. Hoare所发展的，以平均效能来说，排序n个项目要Θ(nlogn)次比较。然而，在最坏的效能下，它需要Θ(n2)次比较。一般来说，快速排序实际上明显地比其他Θ(nlogn) 算法更快，因为它的内部循环（inner loop）可以在大部分的架构上很有效率地被实现出来，且在大部分真实世界的数据，可以决定设计的选择，减少所需时间的二次方项之可能性。算法描述快速排序使用分治法（Divide and conquer）策略来把一个串行（list）分为两个子串行（sub-lists）。步骤为： 从数列中挑出一个元素，称为 "基准"（pi</summary><published>2011-04-13T16:34:00Z</published><updated>2011-04-13T16:34:00Z</updated><author><name>BlueDream</name><uri>http://www.cnblogs.com/bluedream2009/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedream2009/archive/2011/04/14/2015527.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedream2009/archive/2011/04/14/2015527.html"/><content type="html"/></entry><entry><id>http://www.cnblogs.com/bluedream2009/archive/2011/04/13/2014347.html</id><title type="text">【思维】堆排序</title><summary type="text">算法定义堆排序（Heapsort）是指利用（堆）这种数据结构所设计的一种排序算法。堆积树是一个近似完全二叉树的结构，并同时满足堆属性：即子结点的键值或索引总是小于（或者大于）它的父节点。 最差时间复杂度 O(nlogn) 最优时间复杂度 O(nlogn) 平均时间复杂度 Θ(nlogn) 算法描述在堆积树的数据结构中，堆积树中的最大值总是位于根节点。堆积树中定义以下几种操作： 最大堆积调整（Max_Heapify）：将堆积树的末端子结点作调整,使得子结点永远小于父结点 创建最大堆积（Build_Max_Heap）：将堆积树所有数据重新排序 堆积排序（HeapSort）：移除位在第一个数据的根结</summary><published>2011-04-12T17:35:00Z</published><updated>2011-04-12T17:35:00Z</updated><author><name>BlueDream</name><uri>http://www.cnblogs.com/bluedream2009/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedream2009/archive/2011/04/13/2014347.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedream2009/archive/2011/04/13/2014347.html"/><content type="html"/></entry><entry><id>http://www.cnblogs.com/bluedream2009/archive/2011/04/09/2010269.html</id><title type="text">【思维】插入排序</title><summary type="text">算法定义插入排序（Insertion Sort）的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列，对于未排序数据，在已排序序列中从后向前扫描，找到相应位置并插入。插入排序在实现上，通常采用in-place排序（即只需用到O(1)的额外空间的排序），因而在从后向前扫描过程中，需要反复把已排序元素逐步向后挪位，为最新元素提供插入空间。算法描述一般来说，插入排序都采用in-place在数组上实现。具体算法描述如下：从第一个元素开始，该元素可以认为已经被排序取出下一个元素，在已经排序的元素序列中从后向前扫描如果该元素（已排序）大于新元素，将该元素移到下一位置重复步骤3，直到找到已排序</summary><published>2011-04-09T04:23:00Z</published><updated>2011-04-09T04:23:00Z</updated><author><name>BlueDream</name><uri>http://www.cnblogs.com/bluedream2009/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedream2009/archive/2011/04/09/2010269.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedream2009/archive/2011/04/09/2010269.html"/><content type="html"/></entry><entry><id>http://www.cnblogs.com/bluedream2009/archive/2010/03/17/1688279.html</id><title type="text">【思维】归并排序</title><summary type="text">归并排序:是一个在效率上高于一般排序的算法.一般排序:冒泡, 插入, 选择排序的时间复杂度为O(N^2), 而归并排序的时间复杂度为O(N*LOG N).如果N(及排序项的数目)是10000.那么N^2就是100000000, 而N * LOG N则是40000. 也就是如果这个数量的数据.如果用归并排序需要40S的时间,那么用插入排序则需要28个小时.归并排序算法的核心:核心思想就是分治算法.先进行划分,再进行排序归并.归并两个有序的数组.即归并两个有序的数组A和B,然后就有了包含这两个新数组的数组C.即一次拿出A和B的数组项进行比较.小的就插入到新容器C中.直到一方已经插入完毕.如果另一方</summary><published>2010-03-17T08:53:00Z</published><updated>2010-03-17T08:53:00Z</updated><author><name>BlueDream</name><uri>http://www.cnblogs.com/bluedream2009/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedream2009/archive/2010/03/17/1688279.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedream2009/archive/2010/03/17/1688279.html"/><content type="text">归并排序:是一个在效率上高于一般排序的算法.一般排序:冒泡, 插入, 选择排序的时间复杂度为O(N^2), 而归并排序的时间复杂度为O(N*LOG N).如果N(及排序项的数目)是10000.那么N^2就是100000000, 而N * LOG N则是40000. 也就是如果这个数量的数据.如果用归并排序需要40S的时间,那么用插入排序则需要28个小时.归并排序算法的核心:核心思想就是分治算法.先进行划分,再进行排序归并.归并两个有序的数组.即归并两个有序的数组A和B,然后就有了包含这两个新数组的数组C.即一次拿出A和B的数组项进行比较.小的就插入到新容器C中.直到一方已经插入完毕.如果另一方</content></entry><entry><id>http://www.cnblogs.com/bluedream2009/archive/2010/01/18/1650352.html</id><title type="text">【思维】javascript选择排序</title><summary type="text">上篇写了冒泡排序.冒泡排序算法复杂度为O(n^2).本篇在冒泡排序的基础上进行了一点精进.那就是选择排序.选择排序与冒泡排序的区别就是:不需要像冒泡排序那样每次都交换元素.选择排序法的第一层循环从起始元素开始选到倒数第二个元素,主要是在每次进入的第二层循环之前,将外层循环的下标赋值给临时变量,接下来的第二层循环中,如果发现有比这个最小位置处的元素更小的元素,则将那个更小的元素的下标赋给临时变量,最...</summary><published>2010-01-18T01:39:00Z</published><updated>2010-01-18T01:39:00Z</updated><author><name>BlueDream</name><uri>http://www.cnblogs.com/bluedream2009/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedream2009/archive/2010/01/18/1650352.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedream2009/archive/2010/01/18/1650352.html"/><content type="text">上篇写了冒泡排序.冒泡排序算法复杂度为O(n^2).本篇在冒泡排序的基础上进行了一点精进.那就是选择排序.选择排序与冒泡排序的区别就是:不需要像冒泡排序那样每次都交换元素.选择排序法的第一层循环从起始元素开始选到倒数第二个元素,主要是在每次进入的第二层循环之前,将外层循环的下标赋值给临时变量,接下来的第二层循环中,如果发现有比这个最小位置处的元素更小的元素,则将那个更小的元素的下标赋给临时变量,最...</content></entry><entry><id>http://www.cnblogs.com/bluedream2009/archive/2010/01/14/1647614.html</id><title type="text">【思维】javascript冒泡排序</title><summary type="text">学这些的目的就是为了锻炼逻辑思维.也许像冒泡排序这种低效的排序.很少能使用得到. 但高级算法也都是在这些简单算法的积累上产生的.下面就介绍下冒泡排序的原理:冒泡排序算法的运作如下比较相邻的元素。如果第一个比第二个大，就交换他们两个。对每一对相邻元素作同样的工作，从开始第一对到结尾的最后一对。在这一点，最后的元素应该会是最大的数。针对所有的元素重复以上的步骤，除了最后一个(体现在程序中.就是用外层循...</summary><published>2010-01-14T03:28:00Z</published><updated>2010-01-14T03:28:00Z</updated><author><name>BlueDream</name><uri>http://www.cnblogs.com/bluedream2009/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedream2009/archive/2010/01/14/1647614.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedream2009/archive/2010/01/14/1647614.html"/><content type="text">学这些的目的就是为了锻炼逻辑思维.也许像冒泡排序这种低效的排序.很少能使用得到. 但高级算法也都是在这些简单算法的积累上产生的.下面就介绍下冒泡排序的原理:冒泡排序算法的运作如下比较相邻的元素。如果第一个比第二个大，就交换他们两个。对每一对相邻元素作同样的工作，从开始第一对到结尾的最后一对。在这一点，最后的元素应该会是最大的数。针对所有的元素重复以上的步骤，除了最后一个(体现在程序中.就是用外层循...</content></entry><entry><id>http://www.cnblogs.com/bluedream2009/archive/2009/09/03/1559677.html</id><title type="text">链表结构之有序链表</title><summary type="text">有序链表:存储有序数据的链表结构为有序链表.有了以前链表的基础.写起来就很简单了.无非是从first循环链结点,一直找到一个大于当前链结点关键字的那个链结点.将追加的这个链结点插到前面即可.需要注意的就是插入在头部和尾部的特殊处理.下面写了个用有序链表做排序: [代码]运行结果为: [代码]有序链表的效率:有序链表插入数据效率为O(N),但查找跟删除最大数据就是表头数据效率为O(1).所以在最小数...</summary><published>2009-09-03T08:57:00Z</published><updated>2009-09-03T08:57:00Z</updated><author><name>BlueDream</name><uri>http://www.cnblogs.com/bluedream2009/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedream2009/archive/2009/09/03/1559677.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedream2009/archive/2009/09/03/1559677.html"/><content type="text">有序链表:存储有序数据的链表结构为有序链表.有了以前链表的基础.写起来就很简单了.无非是从first循环链结点,一直找到一个大于当前链结点关键字的那个链结点.将追加的这个链结点插到前面即可.需要注意的就是插入在头部和尾部的特殊处理.下面写了个用有序链表做排序: [代码]运行结果为: [代码]有序链表的效率:有序链表插入数据效率为O(N),但查找跟删除最大数据就是表头数据效率为O(1).所以在最小数...</content></entry><entry><id>http://www.cnblogs.com/bluedream2009/archive/2009/09/03/1559194.html</id><title type="text">链表结构之ADT(栈与队列模拟)</title><summary type="text">ADT(抽象数据类型):泛泛的说,就是将类(数据类型)进行高度抽象.着重于他做了什么而忽略了他是怎么做的.即下面两类用链表分别模拟栈(Stack)和队列(Queue).栈: FILO先进后出.拥有push(入栈)和pop(出栈)队列: FIFO先进先出.拥有insert(入列)和remove(出列).ADT即是将链表方法进行封装.让使用者只关心本身方法使用,而不关心具体的实现方式.模拟的代码分别如...</summary><published>2009-09-02T16:13:00Z</published><updated>2009-09-02T16:13:00Z</updated><author><name>BlueDream</name><uri>http://www.cnblogs.com/bluedream2009/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedream2009/archive/2009/09/03/1559194.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedream2009/archive/2009/09/03/1559194.html"/><content type="text">ADT(抽象数据类型):泛泛的说,就是将类(数据类型)进行高度抽象.着重于他做了什么而忽略了他是怎么做的.即下面两类用链表分别模拟栈(Stack)和队列(Queue).栈: FILO先进后出.拥有push(入栈)和pop(出栈)队列: FIFO先进先出.拥有insert(入列)和remove(出列).ADT即是将链表方法进行封装.让使用者只关心本身方法使用,而不关心具体的实现方式.模拟的代码分别如...</content></entry><entry><id>http://www.cnblogs.com/bluedream2009/archive/2009/09/02/1558687.html</id><title type="text">链表结构之双端链表</title><summary type="text">双端链表:双端链表与传统链表非常相似.只是新增了一个属性-即对最后一个链结点的引用如上图所示:由于有着对最后一个链结点的直接引用.所以双端链表比传统链表在某些方面要方便.比如在尾部插入一个链结点.双端链表可以进行直接操作但传统链表只能通过next节点循环找到最后链结点操作.所以双端链表适合制造队列.下面的双端链表类.有几个重要方法.insertFirst(插入首链结点)这个方法与上篇博文的单链表是...</summary><published>2009-09-02T04:52:00Z</published><updated>2009-09-02T04:52:00Z</updated><author><name>BlueDream</name><uri>http://www.cnblogs.com/bluedream2009/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedream2009/archive/2009/09/02/1558687.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedream2009/archive/2009/09/02/1558687.html"/><content type="text">双端链表:双端链表与传统链表非常相似.只是新增了一个属性-即对最后一个链结点的引用如上图所示:由于有着对最后一个链结点的直接引用.所以双端链表比传统链表在某些方面要方便.比如在尾部插入一个链结点.双端链表可以进行直接操作但传统链表只能通过next节点循环找到最后链结点操作.所以双端链表适合制造队列.下面的双端链表类.有几个重要方法.insertFirst(插入首链结点)这个方法与上篇博文的单链表是...</content></entry><entry><id>http://www.cnblogs.com/bluedream2009/archive/2009/09/01/1558045.html</id><title type="text">链表结构之单链表</title><summary type="text">链表:一种数据存储结构.学链表首先要搞懂数组,按朋友的话说,数组和链表的关系就相当于QQ2008和QQ2009.除非要通过索引频繁访问各个数据,不然大多数情况下都可以用链表代替数组.链表部分主要要涉及:单链表,双端链表,有序链表,双向链表和有迭代器的链表(迭代器是用来随机访问链表元素的一种方法).由于以前贪玩数据结构没上课,现在后悔所以要努力补上.链结点:在链表中,每个数据项都被包含在"链结点"(...</summary><published>2009-09-01T06:36:00Z</published><updated>2009-09-01T06:36:00Z</updated><author><name>BlueDream</name><uri>http://www.cnblogs.com/bluedream2009/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedream2009/archive/2009/09/01/1558045.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedream2009/archive/2009/09/01/1558045.html"/><content type="text">链表:一种数据存储结构.学链表首先要搞懂数组,按朋友的话说,数组和链表的关系就相当于QQ2008和QQ2009.除非要通过索引频繁访问各个数据,不然大多数情况下都可以用链表代替数组.链表部分主要要涉及:单链表,双端链表,有序链表,双向链表和有迭代器的链表(迭代器是用来随机访问链表元素的一种方法).由于以前贪玩数据结构没上课,现在后悔所以要努力补上.链结点:在链表中,每个数据项都被包含在"链结点"(...</content></entry><entry><id>http://www.cnblogs.com/bluedream2009/archive/2009/08/23/1552342.html</id><title type="text">java选择排序和二分查找</title><summary type="text">[代码]</summary><published>2009-08-23T04:44:00Z</published><updated>2009-08-23T04:44:00Z</updated><author><name>BlueDream</name><uri>http://www.cnblogs.com/bluedream2009/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bluedream2009/archive/2009/08/23/1552342.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bluedream2009/archive/2009/08/23/1552342.html"/><content type="text">[代码]</content></entry></feed>
