所谓二分查找,就是在有序的数组中查找某一值的元素,基本方法是分治
不保证Key(所查找的关键字)在集合中的查找
例如:最长不下降子序列中的二分查找,当动规到某一位置时,要知道在辅助数组中Key的位置,需要找到Key所在位置或仅比Key小的(\(\)c[i]\leqslant key
CODE:
这样写好像很简单
所谓二分查找,就是在有序的数组中查找某一值的元素,基本方法是分治
例如:最长不下降子序列中的二分查找,当动规到某一位置时,要知道在辅助数组中Key的位置,需要找到Key所在位置或仅比Key小的(\(\)c[i]\leqslant key
CODE:
这样写好像很简单
MY CODE:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include<stdio.h> //nlogn算法 /*把10000搞成1000了,错了一下午*/ int n,max; int b[10001],a[10001],len[10001]; int bins(int key) { static int l,r,y; l=0;r=n; while (l<=r){ y=(l+r)>>1; if (b[y]>key) r=y-1;else if (b[y]<key) {if (b[y+1]>key) return y;else l=y+1;}//这里大括号为了阅读方便 else return y; } } int main(){ int i,j; scanf("%d\n",&n); for (i=1;i<=n;i++){scanf("%d",&a[i]);b[i]=20000;} b[0]=0;//这个初始化要比所有元素小 for (i=1;i<=n;i++){ len[i]=bins(a[i]-1)+1; if (len[i]>max) max=len[i]; if (b[len[i]]>a[i]) b[len[i]]=a[i]; } printf("%d",max); return 0; } |
SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算。也有人说SPFA本来就是Bellman-Ford算法,现在广为流传的Bellman-Ford算法实际上是山寨版。
算法大致流程是用一个队列来进行维护。 初始时将源加入队列。 每次从队列中取出一个元素,并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队。 直到队列为空时算法结束。
这个算法,简单的说就是队列优化的bellman-ford,利用了每个点不会更新次数太多的特点发明的此算法
Continue reading “SPFA”
{
作者:时光9154
当然底下的C代码是我(Comzyh)写的
http://hi.baidu.com/time9154
}
多关键字的快速排序
解决类似如下的问题:输入n组坐标(xi,yi),要求按xi的升序排序后,对于xi=xj(j>i),yi~j升序排列
即双关键字排序,先保证第一关键字的升序,在第一关键字一样的情况下保证第二关键字的升序
Continue reading “[转]多关键字的快速排序”