java查找算法_常用查找算法(Java)

常用查找算法(Java)

2018-01-22

1 顺序查找

就是一个一个依次查找

2 二分查找

二分查找(Binary Search)也叫作折半查找。

二分查找有两个要求,

一个是数列有序,

另一个是数列使用顺序存储结构(比如数组)。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

/*** 二分查找*/

public classBinarySearch {public static voidmain(String[] args)

{int[] arr=new int[]{1,2,3,5,6,6,8,9};

BinarySearch binarySearch=newBinarySearch(arr);

System.out.println(binarySearch.searchRecursion(5));

System.out.println(binarySearch.searchRecursion(4));

System.out.println(binarySearch.searchRecursion(6));

System.out.println(binarySearch.search(5));

System.out.println(binarySearch.search(7));

System.out.println(binarySearch.search(6));

}private int[] arr;public BinarySearch(int[] arr)

{this.arr=arr;

}public int searchRecursion(inttarget)

{return searchRecursion(target,0,arr.length-1);

}private int searchRecursion(int target,int begin,intend)

{if(begin<=end)

{int mid=(begin+end)/2;if(arr[mid]==target) returnmid;if(arr[mid]>target)return searchRecursion(target,begin,mid-1);else

return searchRecursion(target,mid+1,end);

}return -1;

}private int search(inttarget)

{int begin =0;int end=arr.length-1;while(begin<=end)

{int mid=(begin+end)/2;if(arr[mid]==target) returnmid;if(arr[mid]>target) end=mid-1;else begin=mid+1;

}return -1;

}

}

View Code

3 分块查找

分块查找是结合二分查找和顺序查找的一种改进方法。在分块查找里有索引表和分块的概念。索引表就是帮助分块查找的一个分块依据。分块查找只需要索引表有序。

分块查找有点类似于哈希表,但又不如散列表好用,其实很多时候我们在编程中并不会直接用到这个算法,但是分块的思想在很多时候还是很有用的。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public classBlockSearch {public static voidmain(String[] args) {int[] index = new int[]{10, 20, 30};

BlockSearch blockSearch= newBlockSearch(index);

blockSearch.insert(-1);

blockSearch.insert(10);

blockSearch.insert(25);//blockSearch.insert(31);

blockSearch.search(0);

blockSearch.search(-1);

blockSearch.search(10);

blockSearch.search(25);

}private int[] index;privateArrayList[] list;public BlockSearch(int[] index) {if (index != null && index.length != 0) {this.index =index;

list= newArrayList[index.length];for (int i = 0; i < list.length; i++) {

list[i]= newArrayList();

}

}else{throw new Error("index cannot be null or empty.");

}

}public void insert(intdata) {int i =binarySearch(data);

list[i].add(data);

}public void search(intdata) {int i =binarySearch(data);for (int j = 0; j < list[i].size(); j++) {if (data == (int) list[i].get(j)) {

System.out.println(String.format("'%d' Position: [%d,%d]", data, i, j));return;

}

}

System.out.println(String.format("'%d' Position: Not found", data));

}private int binarySearch(intdata) {if(data>index[index.length-1])throw new Error("out of block range");int start = 0;int end = index.length - 1;intmid;while (start

mid= (start + end) / 2;if (index[mid] > data) end = mid - 1;else

//如果相等,也插入后面 <=index[start]

start = mid + 1;

}returnstart;

}

}

View Code

4 搜索引擎与倒排索引

搜索引擎就是从大量的数据中根据关键字查找出对应的信息。搜索引擎之所以能够快速地根据我们键入的关键字获取结果列表,这都是索引的功劳。

索引分为倒排索引和正排索引,我们用到的一般都是倒排索引。

倒排索引的英文是Inverted Index。比如有一个文档列表,每个文档都会有唯一的ID,我们建立关键字和文档id的索引表即可。

倒排索引的关键字提取,对于英文比较容易,可以以单词分割;对于中文就比较复杂,不同的字组成的词很多。比如“中华人民共和国”这个词可以是一个词,“中华”也可以是一个词,并分出其他好多词。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值