-
Unimodal Search - [康朴塔散思]
2007-12-20
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
一个array中所有的元素先升序排列,后降序排列称之为Unimodal,Unimodal Search就是要找到这个最大的值,O(lgn)的做法就是二分法查询,如果所取的元素大于两边的元素,则是最大值,如果左面大,就在左半边取,右面大,则在右半边取,直到取到为止。应用在convex中找端点的最大x坐标和最大y坐标。找最大的x坐标就是在原本的排列中进行Unimodal Search,找最大的y坐标就是从找到的最大的x坐标那个点开始寻找到第一个点,在这些点中进行Unimodal Search。代码片段如下,写的很挫,不过还是能运行的。
http://damocles.blogbus.com/logs/12357150.html
1 int middle(int *UnimodalList,int middlenum)
2 {
3 if((UnimodalList[middlenum]>UnimodalList[middlenum-1])&&
(UnimodalList[middlenum]>UnimodalList[middlenum+1]))
4 return 1;
5 else
6 return 0;
7 }
8 int left(int *UnimodalList,int middlenum)
9 {
10 if((UnimodalList[middlenum]1])&&
(UnimodalList[middlenum]>UnimodalList[middlenum+1]))
11 return 1;
12 else
13 return 0;
14 }
15
16 int UnimodalSearch(int * UnimodalList,int * indexp, int * maximump,int start, int end)
17 {
18 int size=NR_UnimodalList;
19 int middlenum=(start+end)/2;
20 if(middle(UnimodalList,middlenum))
21 {
22 *indexp=middlenum;
23 *maximump=UnimodalList[middlenum];
24 return 0;
25 }
26 else if(left(UnimodalList,middlenum))
27 {
28 return UnimodalSearch(UnimodalList,indexp,maximump,start,middlenum);
29 }
30 else
31 {
32 return UnimodalSearch(UnimodalList,indexp,maximump,middlenum,end);
33 }
34 return 1;
35 }
36历史上的今天:
svn server and client configuration 2008-12-20LXR(Linux Cross Reference)安装配置心得 2007-12-20Notification Chains机制分析 2007-12-20Linux内核防火墙Netfilter实现机制 2007-12-20SSL过程 2007-12-20随机文章:
Universal Hashing 2009-10-21symbol table for windbg 2009-08-07Use bridge networking in kvm guest os 2009-06-16Linkers and Loaders 2009-02-22ctrl-c的实现 2008-08-26
收藏到:Del.icio.us







