data structures and algorithms
钱吉
action is powerful than speaking
展开
-
排序算法3
前面介绍的冒泡排序,插入排序,shell排序都是基于两两元素比较,然后移动的排序算法,有着O(N2)的复杂度,今天讲三种比较牛的排序算法,可以将复杂度降低为O(n*lgn)。分别是:1) 堆排序。2)归并排序。3)快速排序。1、堆排序算法:利用二叉堆(binary heap)的数据结构形式,及其性质对数据进行排序。首先看下什么是二叉堆,wiki解释:二叉堆是一种特殊原创 2014-07-18 23:02:48 · 630 阅读 · 0 评论 -
排序算法4
今天讲两种比较诡异的排序算法,之所以诡异是因为这两种排序算法与之前介绍的几种不太一样(见排序算法前三篇)。之前的排序算法都是基于元素比较来得到的,它们中间,像堆排序,快排等都有着比较理想的时间复杂度下界O(nlgn)。那么有没有更快的排序算法?有!下面的这两种排序算法的最好时间复杂度是O(n)。是不是很诱惑?一起来看看。1)桶排序桶排序实际上是先定义m个单元,每个单元满足一定的条件原创 2014-07-18 23:00:51 · 643 阅读 · 0 评论 -
最快线程间数据交换算法,有效避免锁竞争---TwoQueues
转自:http://software.intel.com/zh-cn/blogs/2013/03/21/twoqueues/?utm_campaign=CSDN&utm_source=intel.csdn.net&utm_medium=Link&utm_content=%20Multicore%20%E2%80%93%20TwoQueues处理多线程数据共享问题注意的几个要点:转载 2013-05-28 12:55:12 · 649 阅读 · 0 评论 -
求所有最大公共子序列的算法实现
最近看了很多关于LCS(Longest common subsequence problem,最长公共子序列)的文章,大部分问题都只是求出最大公共子序列的长度,或者打印处其中的任意一个最大子序列即可,但是如何快速的打印出所有的最大长度子序列?这个问题好像看到的不多。本文给出了传统的DP(dynamic programming,动态规划)算法进行求解的过程,并用c语言实现。另外参考一篇论文实现了其中原创 2014-07-18 21:05:56 · 544 阅读 · 0 评论 -
排序算法1
整理一下比较主流的几种排序算法,这篇介绍的排序算法有:1) 冒泡排序,2) 插入排序。一:冒泡排序这已经成为了教科书式的排序算法了。很容易实现,且对部分已经排好序的数据进行排序时,具有比较好的效率。它的最坏情形是O(N2)。算法思路:以从小到大排序为例,每次从数组最后一个元素开始,比较相邻的两个元素,如果array[j] 1 void BubbleSort(int arr原创 2014-07-19 09:42:35 · 600 阅读 · 0 评论 -
三种数据队列的实现
1 /** 2 * 文件名称:dataqueue.h 3 * 摘 要:本文件实现了三种数据队列:简单队列,单队列类和双数据队列类。 4 1) 简单队列:使用List库,动态分配内存,使用临界区保证互斥 5 2)单队列:采用链表实现,一次性分配内存。减少频繁内存申请开销,同样采用临界区保存互斥。 6 3原创 2014-07-19 09:37:30 · 767 阅读 · 0 评论 -
求数组全排列算法的递归实现
代码:#include #include using namespace std;/***\brief 求全排列的递归实现*\param arr-数组指针* nLen-数组长度* nBegin-排列区间的起始序号* nEnd-排列区间的末尾序号*\return 无**/templatevoid Perm(T arr[], int nLen, int nBegin, i原创 2013-06-21 15:31:02 · 1016 阅读 · 0 评论 -
数组和指针
记录整理一些在阅读《征服C指针》过程中的感想。1 关于数组和数组指针char array1[2]; //定义一个数组,包含了2个char元素char (*array2)[2]; //定义一个数组指针,这个指针指向的数组是一个包含了2个元素的数组另外:(1)数组名称array其实代表了数组首元素的地址,即&array[0],而&array代表原创 2013-06-08 22:57:40 · 631 阅读 · 0 评论 -
练手系列(链表)
简单的单向链表的实现,主要功能包括:链表反转 元素获取 链表合并。LinkList.h 1 #ifndef _HEADER_LINKLIST_CLASS 2 #define _HEADER_LINKLIST_CLASS 3 #include 4 using namespace std; 5 6 typedef struct _ListNode 7 { 8原创 2014-07-18 21:05:45 · 564 阅读 · 0 评论 -
图论:最短路径搜索--Dijkstra算法(c代码实现)
最近因为辞职,有不少闲功夫,重温下数据结构,顺便练练手。今天说说最短路径搜索算法中的Dijkstra原理和实现。一:简介 这个算法用于解决图中单源最短路径问题。所谓单源节点是指给定源节点,求图中其它节点到此源节点的最短路径。如下图所示:给定源节点a,求节点b到a的最短距离。(图来自于参考资料2)那么如何寻找?还是以上图为例:1)初始化:设定除源节点以外的其它所有节点到源节原创 2014-07-18 21:05:58 · 1690 阅读 · 0 评论 -
快速排序算法及其注意事项
在论坛上看到一篇讲快速排序算法的文章,不记得是谁了,然后出于兴趣自己动手学习了一下,下面是一点心得:算法:利用分治思想,每次定义一个主元,然后从前后两个方向进行对比和移动,把数据按照基元为中心,分成两份,前面的为所有大于基于的数,后面的为所有小于基元的数(从小到大排序则相反),然后递归调用,分别再对两侧的数组进行排序,直到顺序排好为止。代码: 1 /******************原创 2014-07-18 21:05:34 · 1570 阅读 · 0 评论 -
HTK代码中的log-add算法实现
在语音识别处理中,一般采用基于高斯混合模型的HMM框架。在模型的训练中(如htk的代码),涉及到大量的概率值计算,这些概率值往往是很小的浮点数。而且概率值相乘后会越变越小,计算起来会损失精度,为了保持准确度,统一将这些概率值进行log处理,再参与运算。也就是说,在代码中处理的概率是对数域的值,即:p1' = logp1p2' = logp2在对数域中,乘法和除法变换为:lo原创 2014-07-19 09:41:26 · 1145 阅读 · 1 评论 -
排序算法2
前面讲了冒泡排序和插入排序,今天讲的排序算法是shell排序shell排序命名来自于Donald Shell,该算法被证明为有亚二次时间界。是插入排序的一种改进,舍弃了插入排序逐一比较的不足之处,而是设定一个增量,间隔比较。然后逐渐缩小这个增量,最终达到排序目的,所以shell排序也叫缩减增量排序。首先,需要设定一组增量序列,h1,h2,...hk。然后先从h1开始,以此增量为步长原创 2014-07-19 09:45:35 · 568 阅读 · 0 评论