經常使用查找算法(Java)
2018-01-22算法
1 順序查找
就是一個一個依次查找編程
2 二分查找
二分查找(Binary Search)也叫做折半查找。數組
二分查找有兩個要求,ide
- 一個是數列有序,
- 另外一個是數列使用順序存儲結構(好比數組)。


/** * 二分查找 */ public class BinarySearch { public static void main(String[] args) { int[] arr=new int[]{1,2,3,5,6,6,8,9}; BinarySearch binarySearch=new BinarySearch(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(int target) { return searchRecursion(target,0,arr.length-1); } private int searchRecursion(int target,int begin,int end) { if(begin<=end) { int mid=(begin+end)/2; if(arr[mid]==target) return mid; if(arr[mid]>target) return searchRecursion(target,begin,mid-1); else return searchRecursion(target,mid+1,end); } return -1; } private int search(int target) { int begin =0; int end=arr.length-1; while(begin<=end) { int mid=(begin+end)/2; if(arr[mid]==target) return mid; if(arr[mid]>target) end=mid-1; else begin=mid+1; } return -1; } }
3 分塊查找
分塊查找是結合二分查找和順序查找的一種改進方法。在分塊查找裏有索引表和分塊的概念。索引表就是幫助分塊查找的一個分塊依據。分塊查找只須要索引表有序。this
分塊查找有點相似於哈希表,但又不如散列表好用,其實不少時候咱們在編程中並不會直接用到這個算法,可是分塊的思想在不少時候仍是頗有用的。搜索引擎


public class BlockSearch { public static void main(String[] args) { int[] index = new int[]{10, 20, 30}; BlockSearch blockSearch = new BlockSearch(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; private ArrayList[] list; public BlockSearch(int[] index) { if (index != null && index.length != 0) { this.index = index; list = new ArrayList[index.length]; for (int i = 0; i < list.length; i++) { list[i] = new ArrayList(); } } else { throw new Error("index cannot be null or empty."); } } public void insert(int data) { int i = binarySearch(data); list[i].add(data); } public void search(int data) { 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(int data) { if(data>index[index.length-1]) throw new Error("out of block range"); int start = 0; int end = index.length - 1; int mid; while (start < end) { mid = (start + end) / 2; if (index[mid] > data) end = mid - 1; else //若是相等,也插入後面 <=index[start] start = mid + 1; } return start; } }
4 搜索引擎與倒排索引
搜索引擎就是從大量的數據中根據關鍵字查找出對應的信息。搜索引擎之因此可以快速地根據咱們鍵入的關鍵字獲取結果列表,這都是索引的功勞。spa
索引分爲倒排索引和正排索引,咱們用到的通常都是倒排索引。code
倒排索引的英文是Inverted Index。好比有一個文檔列表,每一個文檔都會有惟一的ID,咱們創建關鍵字和文檔id的索引表便可。orm
倒排索引的關鍵字提取,對於英文比較容易,能夠以單詞分割;對於中文就比較複雜,不一樣的字組成的詞不少。好比「中華人民共和國」這個詞能夠是一個詞,「中華」也能夠是一個詞,並分出其餘好多詞。blog