首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

二分搜索课题1-在非递减数组中寻找满足A[i]=i的i

2012-09-05 
二分搜索专题1-在非递减数组中寻找满足A[i]i的i在javaeye上看到了一个二分搜索相关的提问http://www.itey

二分搜索专题1-在非递减数组中寻找满足A[i]=i的i
在javaeye上看到了一个二分搜索相关的提问http://www.iteye.com/topic/1118606,我设计了一个简洁高效的算法,这里贴出来:
题目:对于一个非递减数组A,存在A[i]=i,求o(lgn)的算法找出i,
分析:
1,对于任意的j和i,如果j>i则A[j]>=A[i];
2,假设所求的解是I,即A[I]=I,则对任意的j,如果A[j]>j,可以得到I<j,如果A[j]<j,则j<I,如果A[j]=j,则j=I(不考虑I的多解情况).

利用2可以得到下面的算法:

public static int search(int[] A) {      int len = A.length;      int start = 0;      int end = len;      while (start <= end) {          int j = (start + end) / 2;          if (A[j] == j) {              return j;          }          if (A[j] > j) {              end = j - 1;          } else if (A[j] < j) {              start = j + 1;          }      }      return -1;  }  

解析:
当A[j]>j时,抛弃[j,end]的区间,当A[j]<j时,抛弃[start,j]的区间

欢迎网友的指导。

热点排行