二分查找 续

  继续上一篇的问题,怎么返回重复元素的起始和终止坐标,有了上一篇的函数,这个问题很简单了。

对于迭代方法我们可以有:

 1 int binary_search_dup(int* A,int beg,int end,int value,int& dup_beg,int& dup_end)
 2 {
 3      stack<Node> s;
 4      int count = 0;                             
 5      int pre = -1;                                       
 6      int bak = -1;                                       
 7      int pos = binary_search(A,beg,end,value);           //返回找到元素的坐标
 8      if(pos != -1)
 9      {
10          Node node = {pos,beg,end};
11          s.push(node);
12          count++;
13          update_pos(pos,dup_beg,dup_end);
14      }
15      else
16          return 0;
17      while(!s.empty())                       
18      {
19          pos = s.top().pos;
20          beg = s.top().beg;
21          end = s.top().end;
22          s.pop();
23          pre = binary_search(A,beg,pos - 1,value);
24          if(pre != -1)
25          {
26              Node node = {pre,beg,pos - 1};
27              s.push(node);
28              count++;
29              update_pos(pre,dup_beg,dup_end);
30          }
31          bak = binary_search(A,pos + 1,end,value);
32          if(bak != -1)
33          {
34              Node node = {bak,pos + 1,end};
35              s.push(node);
36              count++;
37              update_pos(bak,dup_beg,dup_end);
38          }
39      }    
40      return count;
41 }

对于递归:

 1 int binary_search_dup(int* A,int beg,int end,int value,int&dup_beg,int& dup_end)
 2 {
 3     int pos = binary_search(A,beg,end,value);
 4     if(pos != -1)
 5     {
 6         update_pos(pos,dup_beg,dup_end);
 7         return binary_search_dup(A,beg,pos - 1,value,dup_beg,dup_end) + binary_search_dup(A,pos + 1,end,value,dup_beg,dup_end) + 1;
 8     }
 9      return 0;
10 }

update_pos的实现:

1 void update_pos(int pos,int& dup_beg,int& dup_end)
2 {
3     if(pos > -1 && pos < dup_beg)
4         dup_beg = pos;
5     if(pos > 0 && pos > dup_end)
6         dup_end = pos;
7 }

最为二分查找的完结我只想说:用迭代的都是人,用递归的都是神!

posted @ 2012-07-06 10:56  技术•宅  阅读(110)  评论(0)    收藏  举报