常用查找算法(Java)

2018-01-22

1 顺序查找

就是一个一个依次查找

2 二分查找

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

二分查找有两个要求,

  • 一个是数列有序,
  • 另一个是数列使用顺序存储结构(比如数组)。
/**
* 二分查找
*/
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 分块查找

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

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

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 搜索引擎与倒排索引

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

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

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

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

常用查找算法(Java)的更多相关文章

  1. C++ STL 常用查找算法

    C++ STL 常用查找算法 adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. ...

  2. 二分查找算法java实现

    今天看了一下JDK里面的二分法是实现,觉得有点小问题.二分法的实现有多种今天就给大家分享两种.一种是递归方式的,一种是非递归方式的.先来看看一些基础的东西. 1.算法概念. 二分查找算法也称为折半搜索 ...

  3. 常用排序算法java实现

    写在前面:纸上得来终觉浅.基本排序算法的思想,可能很多人都说的头头是到,但能说和能写出来,真的还是有很大区别的. 今天整理了一下各种常用排序算法,当然还不全,后面会继续补充.代码中可能有累赘或错误的地 ...

  4. 二分查找算法java

    二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元 ...

  5. 常用排序算法--java版

    package com.whw.sortPractice; import java.util.Arrays; public class Sort { /** * 遍历一个数组 * @param sor ...

  6. STL常用查找算法介绍

    adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. #include <io ...

  7. C语言实现常用查找算法——二分查找

    #include<stdio.h> void insert_sort(int a[],int n); int binary_search(int a[],int x,int n); voi ...

  8. python实现常用查找算法

    http://www.cnblogs.com/feixuelove1009/p/6148357.html

  9. C++进阶 STL(3) 第三天 函数对象适配器、常用遍历算法、常用排序算法、常用算数生成算法、常用集合算法、 distance_逆序遍历_修改容器元素

    01昨天课程回顾 02函数对象适配器 函数适配器是用来让一个函数对象表现出另外一种类型的函数对象的特征.因为,许多情况下,我们所持有的函数对象或普通函数的参数个数或是返回值类型并不是我们想要的,这时候 ...

随机推荐

  1. JavaScript 表单验证入门

    JavaScript 表单验证 JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证. 被 JavaScript 验证的这些典型的表单数据有: 用户是否已填写表单 ...

  2. java hibernate Criteria 删除数据 delete data 2种方法

    public String deleteByUserAccount(String account) { 方式一: Session session = this.getCurrentSession(); ...

  3. App 开发步骤

    在 iOS 开发中,写一个 App 很容易,但是要写好一个 App,确是要下另一番功夫.首先,我们来看一个 App 的开发要求: 写一个 App,显示出 Spotify 上 Lady Gaga 相关的 ...

  4. Python学习笔记(十)—— 高级特性

    一.切片 1.定义: 经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符. 2.语法: A[1:3] 取出1到3,都是正数的情况下,缺填的为0(第一个),end ...

  5. PHP通过soap调用c#的WebService

    1:C# Contact public class Contact { private int _Id; private string _Name; public int id { get { ret ...

  6. 【Struts2】Struts2与Spring整合后,如何指定Action为多例模式

    Strust2默认是多例的,但是Spring默认是单例的,在进行Spring+Strust2整合的时候,就需要把Spring管理的action指定为多例模式,只需要在action上面加上@Scope( ...

  7. mybatis自定义插件动态修改sql语句

    step1:定义Interceptor实现org.apache.ibatis.plugin.Interceptor import org.apache.commons.logging.Log; imp ...

  8. TensorFlow 中的 tf.train.exponential_decay() 指数衰减法

    exponential_decay(learning_rate, global_step, decay_steps, decay_rate, staircase=False, name=None) 使 ...

  9. php截取字符去掉最后一个字符

    $str="中国.美国.俄罗斯.德国."$str=substr($str,0,-1); 输出结果为:中国.美国.俄罗斯.德国

  10. android studio 如何让包名展开

    通常我们新建一个包名的时候,会发现他们连在一起,根本无法在创建一个同级的包 工具/原料   电脑,android studio 方法/步骤     1,我们先在包名下建一个包,变成了这样,根本无法在同 ...