二分查找 续
继续上一篇的问题,怎么返回重复元素的起始和终止坐标,有了上一篇的函数,这个问题很简单了。
对于迭代方法我们可以有:
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 }
最为二分查找的完结我只想说:用迭代的都是人,用递归的都是神!

浙公网安备 33010602011771号