随笔分类 -  Algorithm

算法(Algorithm)。
算法:堆排序(Heap Sort)
摘要:备注考虑到 Heap 的特性,很容易想到将其用作排序的用处,为了提高效率需要适当的改进一下,如:in place remove 和 in place move down。代码 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DataStuctureStudy.Sorts 8 { 9 class HeapSort10 where T : IC... 阅读全文

posted @ 2013-12-30 11:12 幸福框架 阅读(483) 评论(0) 推荐(0) 编辑

算法:权重图的最最小生成树算法
摘要:算法思路问题给定顶点集合为 V,边集合为 E,求最小生成树 T?解过程任意时刻的边都可以划分为到三个集合:X:边的所有顶点都是最小生成树的一部分。Y:边的末端节点不是最小生成树的一部分。Z:其它。从 Y 中选择权重最小的边,将其加入到 T 中。优先级队列该算法需要用到一个工具:优先级队列(从某个集合中选择最小的元素)。 1 class PriorityQueue 2 where T : IComparable 3 { 4 private T[] _items; 5 private ... 阅读全文

posted @ 2013-12-29 11:07 幸福框架 阅读(3558) 评论(0) 推荐(0) 编辑

算法:权重图的最短路径算法
摘要:算法思路问题给定顶点集合为 V,边集合为 E,求起始节点 S 到 E 的最短路径 P ?路径的权重 = 路径的边的权重之和。解过程任意时刻的路径都可以划分为到三个集合:X:路径的所有顶点都是最短路径的一部分。Y:路径的末端节点不是最短路径的一部分。Z:其它。从 Y 中选择权重最小的路径,将其末端节点加入到最短路径中,如果末端节点是 E,求解结束。优先级队列该算法需要用到一个工具:优先级队列(从某个集合中选择最小的元素)。 1 class PriorityQueue 2 where T : IComparable 3 { 4 ... 阅读全文

posted @ 2013-12-28 09:29 幸福框架 阅读(6754) 评论(0) 推荐(0) 编辑

算法:图(Graph)的遍历、最小生成树和拓扑排序
摘要:背景不同的数据结构有不同的用途,像:数组、链表、队列、栈多数是用来做为基本的工具使用,二叉树多用来作为已排序元素列表的存储,B 树用在存储中,本文介绍的 Graph 多数是为了解决现实问题(说到底,所有的数据结构都是这个目的),如:网络布局、任务安排等。图的基本概念示例顶点(Vertex)上图的 1、2、3、4、5、6 就是顶点。邻接(Adjoin)如果 A 和 B 通过定向边相连,且方向为 A -> B,则 B 为 A 的邻接,如果相连的边是没有方向的,则 A 和 B 互为邻接。边(Edge)顶点之间的连线就是边。连通图(Connected Graph)不考虑边的方向性,从任何一个节点 阅读全文

posted @ 2013-12-27 10:27 幸福框架 阅读(14558) 评论(2) 推荐(2) 编辑

算法:堆(Heap)
摘要:背景Heap 可以用来实现优先级队列,也可以用来做堆排序,本文简单的做个介绍。Heap规则是一个完全二叉树,隐含的意思是:他是平衡的、使用数组进行存储也是连续的。给定的任意节点,该节点小于等于其父亲节点,大于他们的孩子节点。基础知识对于一个完全二叉树,如果将其存储到数组中,给定父节点的索引为:x,则:left child's index is:2*x + 1。right child's index is:2*x + 2。root's index is:0.说明:上面的公式很容易自己推到出来,有兴趣的朋友可以推到一下,这样就不用记住这个特性了。图示存储到数组的顺序为:先存 阅读全文

posted @ 2013-12-26 10:11 幸福框架 阅读(5850) 评论(0) 推荐(4) 编辑

算法:哈希表格(Hash Table)
摘要:背景Java 和 .Net 平台都有一个所有引用类型都会间接或直接继承的类型:Object,这个类型提供最基本的相等性比较算法和哈希算法,很多书上都给出了在重写这两个算法的时候的主意事项,其中大多数主意事项都和哈希表有关。《CLR VIA C#》的作者觉得将哈希算法放到 Object 不是很适合,我也有这种感觉,每次重写相等性比较算法都要重新哈希算法,非常不爽,我就没打算将其用到哈希表中作为键使用。哈希表定义使用哈希算法将 A 数值空间(键)映射到 B 数值空间(存储),如下:A -> 0B -> 1C->2D->3B 数值空间的查询速度要求非常快,毫无疑问就是数值了。 阅读全文

posted @ 2013-12-25 15:00 幸福框架 阅读(1539) 评论(0) 推荐(0) 编辑

算法:非平衡二叉搜索树(UnBalanced Binary Search Tree)
摘要:背景很多场景下都需要将元素存储到已排序的集合中。用数组来存储,搜索效率非常高: O(log n),但是插入效率比较低:O(n)。用链表来存储,插入效率和搜索效率都比较低:O(n)。如何能提供插入和搜索效率呢?这就是二叉搜索树的由来,本文先介绍非平衡二叉搜索树。非平衡二叉搜索树规则所有节点的左节点小于节点,所有节点的右节点大于等于自身,即:node.value > node.left.value && node.value currentRightSmallestParent = current.Right; 2 var currentRightSmal... 阅读全文

posted @ 2013-12-24 16:02 幸福框架 阅读(1674) 评论(2) 推荐(1) 编辑

算法:希尔排序(Shell Sort)
摘要:背景在三种简单的排序算法中(冒泡、选择和插入)插入排序的算法最好,不过插入过程可能需要进行大量的移动,如何尽可能少的移动元素呢?希尔排序正是基于对这个问题的思考而想出来的,考虑到希尔排序对已排序数组的排序效率尤为好(接近O(n)),因此希尔排序会先按照较大的间隔,对间隔的元素进行插入排序,然后将间隔缩小重复上述过程,直到间隔为 1。实现 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7. 阅读全文

posted @ 2013-12-23 09:57 幸福框架 阅读(582) 评论(0) 推荐(0) 编辑

算法:五步教你消除递归
摘要:背景递归对于分析问题比较有优势,但是基于递归的实现效率就不高了,而且因为函数栈大小的限制,递归的层次也有限制。本文给出一种通用的消除递归的步骤,这样您可以在分析阶段采用递归思想,而实现阶段采用非递归算法。函数的调用过程函数的调用是基于栈,每次调用都涉及如下操作:调用开始时:将返回地址和局部变量入栈。调用结束时:出栈并将返回到入栈时的返回地址。使用堆中分配的栈消除递归递归版本代码 1 public static int Triangle(int n) 2 { 3 // 地址:2 4 if (n == 1) 5 ... 阅读全文

posted @ 2013-12-22 14:05 幸福框架 阅读(9485) 评论(6) 推荐(5) 编辑

算法:排列算法
摘要:背景记得上大学期间试着实现一个排列算法,可惜当时没有写出来,只是硬编码了几层循环,今天用递归终于写出来了。实现代码 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DataStuctureStudy 8 { 9 class Program10 {11 static void Main(string[] args)12 ... 阅读全文

posted @ 2013-12-21 20:53 幸福框架 阅读(378) 评论(0) 推荐(0) 编辑

算法:逆波兰表达式求值
摘要:背景运算符求值的一种常见做法是:先将中缀表达式转换为后缀表达式(逆波兰表达式),然后再对后缀表达式求值,之所以这么做的原因是后缀表达式的求值非常简单。代码实现 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DataStuctureStudy.Stacks 8 { 9 public static class Calculator 10 ... 阅读全文

posted @ 2013-12-20 20:35 幸福框架 阅读(1591) 评论(0) 推荐(0) 编辑

算法:中缀表达式转换为逆波兰表达式
摘要:背景此文给出一个中缀表达式转变为逆波兰表达式(后缀表达式)的算法,算法实现的比较简单,特别是:词法分析部分是没有做的。实现 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DataStuctureStudy.Stacks 8 { 9 public static class Calculator 10 { 11 pr... 阅读全文

posted @ 2013-12-19 13:29 幸福框架 阅读(1048) 评论(0) 推荐(0) 编辑

算法:优先级队列(PriorityQueue)
摘要:背景此文给出基于已排序数组的实现,多数情况应该基于 Heap 进行实现,因为数组的插入效率为O(n),而 Heap 的插入效率为 Log(n)。PriorityQueue代码 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DataStuctureStudy.Queues 8 { 9 public class PriorityQueue ... 阅读全文

posted @ 2013-12-18 17:50 幸福框架 阅读(593) 评论(0) 推荐(0) 编辑

算法:基于 RingBuffer 的 Deque 实现
摘要:背景前两篇文章介绍了 Queue 的实现,很多类库都引入了 Deque,Deque 可以两头添加和删除,然后在 Deque 之上构建 Queue 和 Stack。Deque代码 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DataStuctureStudy.Deques 8 { 9 public class Deque 10 ... 阅读全文

posted @ 2013-12-16 12:08 幸福框架 阅读(681) 评论(0) 推荐(0) 编辑

算法:基于 RingBuffer 的 Queue 实现《续》
摘要:背景上篇实现了一个简单的队列,内部使用了 _count 计数,本文采用另外一种模式,不用 _count 计数。RingBuffer不用 _count 计数的话,为了区分队列的满和空,需要在数组中预留一格,如下图就代表了一个满队列。ArrayQueue代码 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DataStuctureStudy.Queues 8 { 9 . 阅读全文

posted @ 2013-12-15 11:29 幸福框架 阅读(1057) 评论(0) 推荐(0) 编辑

算法:基于 RingBuffer 的 Queue 实现
摘要:背景如果基于数组实现队列,常见的选择是采用 RingBuffer,否则就需要移动数组元素。RingBuffer很容易看出 RingBuffer 的思想,这里就不赘述了。您可以思考一个问题:图中表示的场景是一个空队列?还是一个满队列?答案是:单单维护 _header 和 _tail 还不足以判断,必须维护一个 _count 计数。ArrayQueue代码 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tas 阅读全文

posted @ 2013-12-14 10:49 幸福框架 阅读(2844) 评论(0) 推荐(1) 编辑

算法:快速排序(Quick Sort)
摘要:算法定义目前学习是五种排序(冒泡、插入、选择、合并、快速)中,快速排序是最让我喜欢的算法(因为我想不到),其定义如下:随机的从数组中选择一个元素,如:item。对数组进行分区,将小于等于 item 的元素移动到 item 左边,将大于 item 的元素移动到 右边,移动过程 item 的位置也有可能发生变化的。分区后 item 的位置为 ItemIndex,递归的对 0 至 ItemIndex -1 和 ItemIndex + 1 至 length -1 部分执行递归。算法举例【5,4,3,2,1】【5,4,3,2,1】【4,5,3,2,1】【1,5,3,2,4】【1,4,3,2,5】【1,2 阅读全文

posted @ 2013-12-07 09:23 幸福框架 阅读(444) 评论(0) 推荐(0) 编辑

算法:合并排序(Merge Sort)
摘要:算法定义合并排序是一种递归算法,思路如下:如果源数组长度为 1,立即返回。将源数组平分为两个新数组:Left 和 Right。对 Left 执行递归排序。对 Right 执行递归排序。将排序后的 Left 和 Right 执行合并到原数组。可以看出来,改算法的重点是已排序数组的合并过程。算法举例【5,4,3,2,1】【5,4,3】【2,1】【5,4】【3】【2,1】【5】【4】【3】【2,1】【4,5】【3】【2,1】【3,4,5】【2,1】【3,4,5】【2】【1】【3,4,5】【1,2】【1,2,3,4,5】算法实现 1 using System; 2 using System.Colle 阅读全文

posted @ 2013-12-06 09:06 幸福框架 阅读(3845) 评论(0) 推荐(0) 编辑

算法:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)和选择排序(Selection Sort)总结
摘要:背景这两天温习了 5 中排序算法,之前也都看过它们的实现,因为没有深入分析的缘故,一直记不住谁是谁,本文就记录一下我学习的一些心得。三种排序算法可以总结为如下:都将数组分为已排序部分和未排序部分。冒泡排序将已排序部分定义在右端,在遍历未排序部分的过程执行交换,将最大元素交换到最右端。插入排序将已排序部分定义在左端,将未排序部分元的第一个元素插入到已排序部分合适的位置。选择排序将已排序部分定义在左端,然后选择未排序部分的最小元素和未排序部分的第一个元素交换。冒泡排序代码 1 public static void Sort(T[] items) 2 { 3 ... 阅读全文

posted @ 2013-12-04 09:06 幸福框架 阅读(12976) 评论(0) 推荐(1) 编辑

算法:四种冒泡排序(Bubble Sort)实现
摘要:背景大学关于排序的算法,好像就学会了冒泡排序,这个算是排序界的 hello,world 了,冒泡排序的定义如下:重复的遍历数组。 /// /// 重复的遍历数组。 /// 每次遍历都比较两个元素,如果顺序不正确就把他们交换一下。 /// 如果遍历后只交换了 1 次或 0 次,排序结束。 /// 最多需要 length -1 次遍历,第 iterTimes 次需要遍历 length - iterTimes - 1 个元素。 /// 四种实现代码 1 using System; 2 using System.Collections.Generic; 3 usi... 阅读全文

posted @ 2013-12-03 11:22 幸福框架 阅读(1725) 评论(0) 推荐(0) 编辑

导航

我要啦免费统计