随笔分类 -  Algorithms

算法学习
摘要:一个表达式E的逆波兰式如下定义:如果E是一个变量或者常量,E的后缀式是其自身;如果E是E1 op E2的形式,则其后缀式是E1' E2' op的形式,其中E1'表示E1的后缀式;如果E=(E1),那么E的后缀式与E1相同(换言之,逆波兰式不需要括号来表示优先级);将一个普通的中缀表达式exp转换为逆序表达式的一般算法是:stack s1,s2; //s1是临时存放运算符的,s2是存放后缀式的s1.push('#'); //放入优先级最低的符号for x in exp:if(x is num):y=got(x);//注意这里got函数里面必须完成x迭代器的 阅读全文
posted @ 2013-02-28 22:17 生无所息 阅读(419) 评论(0) 推荐(0)
摘要:红黑树一种构建容器库时经常使用的数据结构(如std::map),其构成比较复杂,很难随手写出。所以正常情况下,我们会使用skiplist代替之。红黑树是一种特殊的平衡二叉查找树,它在普通二叉查找树的基础上添加了一个储存位来表示结点的颜色(Red or Black),红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。红黑性质:①black or red;②root is always black;③leaf is always black;④if a node is red,two sons must both be black;⑤Everysimple pathfrom a giv 阅读全文
posted @ 2012-09-25 21:18 生无所息 阅读(251) 评论(0) 推荐(0)
摘要:搜索树是一种很常用的数据结构,支持search、minimum、maximum、predecessor、successor、insert和delete等多种动态集合的操作,经常被用来做字典或优先级队列。binary search tree的所有操作都与树的高度成正比,也就是O(h)。我们称一颗二叉树... 阅读全文
posted @ 2012-09-25 21:06 生无所息 阅读(358) 评论(0) 推荐(0)
摘要:散列技术直接寻址表是对数组的一种简单扩展,适用于元素的关键字全域[0,1...m-1]范围较小的情况,每个槽对应一个关键字,如果槽k为NIL,说明没有关键字为k的元素。如果元素存在某种一致性而可以直接放在一个序列里,可以考虑直接在数组中存放元素,使用下标作为索引,这样直接寻址表就退化为数组。如果只需要数据结构支持Insert、Delete和Search三种操作,那么散列技术是最好的存放海量数据的方法,这种技术在数据库中被大量使用。简单来说就是使用散列函数将关键字映射到槽中,当需要搜索关键字时,直接如果有两个不同的关键字却散列到同一个槽中,这种情况被称为碰撞。为了避免碰撞,散列函数要尽可能随机, 阅读全文
posted @ 2012-09-05 19:04 生无所息 阅读(169) 评论(0) 推荐(0)
摘要:本章为基本数据结构的一些操作,很基础,当然也很重要。数据结构必须是泛型的,但是C对于泛型的支持只有通过void*强制转换,而且这也不是万能的,比较好的书籍可以参看《C interfaces and implementions》,当然这方面的代码是很成熟的。ADT在C中的实现大致通过三种方式:静态数组、动态数组和链表。如果不使用指针,那么必须用宏来实现Stack_Type的泛型,push,pop和top的操作数类型都和Stack_Type关联。静态数组的stack实现就是简单的:#define Stack_Type int#define Stack_Size 2048//static array 阅读全文
posted @ 2012-09-03 16:02 生无所息 阅读(181) 评论(0) 推荐(0)
摘要:1 #include 2 #include 3 #include 4 void swap(int* A,int i,int j) 5 { 6 int temp=A[i]; 7 A[i]=A[j]; 8 A[j]=temp; 9 }10 int partition(in... 阅读全文
posted @ 2012-08-31 10:58 生无所息 阅读(241) 评论(0) 推荐(0)
摘要:计数排序C代码如下,显然这货是不能用于字符串排序的(非比较排序只有基数排序可以用来排序字符串):#include <stdio.h>#include <malloc.h>#include <assert.h>#include <stdlib.h>#define MAX 100 //取值范围k=99,为了保持main形式上的一致性,这里用了宏void counting_sort(int* A,int p,int r){ int* C=(int *)calloc(MAX,sizeof(int)); int* B=(int *)malloc(r*siz 阅读全文
posted @ 2012-08-30 11:26 生无所息 阅读(264) 评论(0) 推荐(0)
摘要:快速排序相关C代码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 void swap(int* A,int i,int j) 5 { 6 int temp=A[i]; 7 A[i]=A[j]; 8 A[j]=temp; 9 }10 int Partition(int* A,int p,int r)11 {12 int x=A[r-1];13 int i=p-1,j=p;14 for(;j<r-1;++j) {15 if(A[j]<=x)16 ... 阅读全文
posted @ 2012-08-27 11:34 生无所息 阅读(197) 评论(0) 推荐(0)
摘要:1 /*-----------Heap-Sort implemented in C------------------*/ 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 inline int left(int i) 7 { 8 //C语言中下标从0开始 9 return (i<<1)+1;10 }11 inline int right(int i)12 {13 return (i<<1)+2;14 }15 inline int parent(int i)16 {17 return (i-1)&g 阅读全文
posted @ 2012-08-23 22:54 生无所息 阅读(206) 评论(0) 推荐(0)
摘要:这部分主要学习概率分析。在概率论的教程里面其实已经学过这些了…附录C的第一部分是排列组合的基础知识;第二部分是经典概率论;第三部分是离散随机分布的一些概念(期望、方差);第四部分介绍了两个常见的离散分布:几何分布和二项分布;最后一部分是可选内容,介绍了二项分布的尾相关的上下界。第五章主要介绍了随机算法的写法,特别强调了均匀随机的概念,引入随机变量指示器作为一个计算期望的技巧。内容小结:计数:略概率:贝叶斯公式: \[Pr\{A | B\}=\dfrac{Pr\{A\}Pr\{B|A\}}{Pr\{B\}}\] 全概率公式:Pr{B}=Pr{B|A1}+Pr{B|A2}+...+Pr{B|... 阅读全文
posted @ 2012-08-21 11:14 生无所息 阅读(314) 评论(0) 推荐(0)
摘要:常用符号:$\Theta$表示渐近确界,O表示渐近上界,$\Omega$表示渐近下界;o表示非渐近上界,$\omega$表示非渐近下界。 下取整:$\lfloor\quad\rfloor$,上取整$\lceil\quad\rceil$ 取模运算:a mod n = a - $\lfloor a/n \rfloor$*n几个结论:$n^b=o(a^n)$(a>1),任何底大于1的指数函数比任何多项式函数增长的更快; $lg^bn=0(n^a)$(a>0),任意正的多项式函数都比多项式对数函数增长的快; 阶乘n!=$o(n^n)$,n!=$\omega(2^n... 阅读全文
posted @ 2012-08-18 19:05 生无所息 阅读(398) 评论(0) 推荐(0)
摘要:凛冬将至。——《冰与火之歌》————————————————————————————插入排序、合并排序: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <malloc.h> 4 #include <string.h> 5 void insertion_sort(int* array,int p,int q) 6 { 7 int j=p+1,i; 8 for(;j<q;++j){ 9 int key=array[j];10 for(i=j-1;i>=0;--i){11 ... 阅读全文
posted @ 2012-08-15 16:45 生无所息 阅读(307) 评论(0) 推荐(0)