06 2011 档案
摘要:应该采用选择树,而选择树有胜者树还有败者树,更加常用的是败者树。败者树的第二个节点是次优的节点。第一个节点是全优节点。 图在相册里面。
阅读全文
摘要:快速排序: 这个思想不仅可以用于排序,还可以用于求第k个数字。 代码: QuickSort(int*arr , int left,int right) { If(left>=right) Return; Intpivot,i,j; Pivot=left; I=left; J=right; While(i<=j) { While(arr[i]<=a[pivot]&&i<=j)i++; If(i>j) break; While(arr[j]>a[pivot]&&i<=j)j--; If(i>j) break; Swap
阅读全文
摘要:先来分析一下o(n*n)的算法:第一种:插入排序:插入排序的时候可以一边比较一边交换。顺便运用了冒泡的思想。代码:For(i=1;i<=n;i++) For(j=I;j>0;j--){If(array[j]>array[j-1]) Swap(array[j],array[j-1]);} 优化算法: 先找i的位置,找的时候就把那些需要往后面移动的就移动了,这个时候是一次赋值操作,所以比较快。 再一步优化:的时候可以用二分查找那个I的位置。二分查找代码: While(left<=right) { Middle=(left+right)/2; If(temp<array
阅读全文
摘要:分割数组,使得分开的数组的和差不多。将一个数组分成和差不多的两个数组。数组个数为2n个。 Arr[i][k]=true;的定义是i个元素的和为k的存在。 For(i=1;i<=2*n;i++) { for(k=min(n-1,i-1);k>=0;k--) for(j=sum/2;j>=0;j--) if(j>a[i]&&arr[k-1][j-a[j]==true) arr[k][j]=true; }对于循环。如果两个循环变量没有什么关系,我觉得调换循环的次序应该没有什么问题的。 求两个数字的和为指定的一个数字。 最快的算法是:先对数组进行排序。o(nlg
阅读全文
摘要:总的来说是深度遍历。以根为节点建立并查集。比如说求p,v的lca。当访问到p的时候检查v是否已经访问过。如果访问过,那么他们的lca就是v现在所在的并查集里面的元素。如果没有访问到。那么等到v访问到的时候可以操作一下。 充分利用了递归这个操作,所以不必要保存以前的东西,自然而然的就将u里面的所有的子节点子孙节点都和并到一块去了。 这个想了比较长的时间。 这个是伪代码 LCA(u) {Make-Set(u)ancestor[Find-Set(u)]=u对于u的每一个孩子v {LCA(v)Union(u)ancestor[Find-Set(u)]=u}checked[u]=true对于每个(u,.
阅读全文

浙公网安备 33010602011771号