常用查找算法(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. 使用libmagic确定文件MIME类型【示例】【转】

    原文地址:http://blog.csdn.net/vevenlcf/article/details/46122661 使用libmagic确定文件MIME类型[示例] 引用:   <http: ...

  2. C++11开发中的Atomic原子操作

    C++11开发中的Atomic原子操作 Nicol的博客铭 原文  https://taozj.org/2016/09/C-11%E5%BC%80%E5%8F%91%E4%B8%AD%E7%9A%84 ...

  3. SQL Server 阻止了对组件 'Agent XPs' 的 过程 'dbo.sp_set_sqlagent_properties' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。

    Sqlserver 2008 在配置分发向导的时候报了如下错误: 使用 Agent XPs 选项可以启用此服务器上的 SQL Server 代理扩展存储过程.如果禁用此选项,则 SQL Server ...

  4. 【转】Braid - 一个发人深思的游戏

    Braid - 一个发人深思的游戏 我已经很久很久没有打游戏了(如果不算 Angry Birds 之类用来打发时间的游戏的话).我的最后一个真正意义上的游戏机,是 PlayStation 1.在那上面 ...

  5. Android中使用IntentService运行后台任务

    IntentService提供了一种在后台线程中运行任务的方式,适合处理运行时间较长的后台任务. 长处: (1)IntentService执行在单独的线程中.不会堵塞UI线程 (2)IntentSer ...

  6. MySQL复制表结构、表数据

    1.复制表结构及数据到新表 CREATE TABLE 新表SELECT * FROM 旧表 这种方法会将oldtable中所有的内容都拷贝过来,当然我们可以用delete from newtable; ...

  7. JavaScript语言精粹之对象

    用object.hasOwnProperty(variable)来确定这个属性名是否为该对象成员,还是来自于原型链. for(my in obj){ if(obj.hasOwnProperty(my) ...

  8. 转:ECharts图表组件入门教程之Theme:ECharts图表的皮肤是什么?如何给图表换主题(皮肤)Theme?

    一.什么是ECharts图表的皮肤(主题)? 针对这个问题我只能这样回答,ECharts图表的主题(皮肤)就犹如人的衣服一样,是用来衬托和渲染主体,使其变得更加美观好看的目的.你去过ECharts图表 ...

  9. Processing支持中文显示

    Processing 默认不支持中文,中文显示成框框,我使用的版本是:2.2.1,进行如下设置,并且重启processing就可以支持中文了: 可以看到中文了:

  10. activiti排他网关

    /*启动流程实例*可以在启动流程时把所有流程变量设置好*/@Test public void startProcessInstance(){ //流程定义key String processDefin ...