常用查找算法(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. centos中执行apt-get命令提示apt-get command not found

    先说结论: 在centos下用yum install xxx yum和apt-get的区别: 一般来说著名的linux系统基本上分两大类:  RedHat系列:Redhat.Centos.Fedora ...

  2. Lua编程笔记

    迭代器并没有真正的迭代,真正迭代的是for循环.而迭代器为每次迭代提供成功后的返回值. function allwords(f)for line in io.lines do for word in ...

  3. nginx端合并JS

    转载于:http://www.tuicool.com/articles/IjMNnq 配置文件: location /static/css/ { concat on; concat_max_files ...

  4. linux平台下server运维问题分析与定位

    结合我工作中碰到的运维问题,总结一下Linux下server常见的运维问题以及定位方式.这里的server主要指自主开发的逻辑server,web srv因为通常采用通用的架构所以问题比较少. 逻辑s ...

  5. mysql insert if not exists防止插入重复记录的方法(转)

    MySQL 当记录不存在时插入(insert if not exists) 在 MySQL 中,插入(insert)一条记录很简单,但是一些特殊应用,在插入记录前,需要检查这条记录是否已经存在,只有当 ...

  6. 【jQuery】利用jQuery实现“记住我”的功能

    [1]先下载jQuery.cookie插件:使用帮助请参考链接(https://github.com/carhartl/jquery-cookie). [2]安装插件: <script type ...

  7. 【MySQL】MySQL之MySQL5.7安装包(msi文件)在Windows8下安装

    最近自己在使用MySQL5.7.16.msi安装MySQL.自己下载的是.msi文件,在安装的过程中遇到了许多文件,网上大部分的Blog都是关于免安装包的安装方法,希望我的方法对大家有帮助. 1,下载 ...

  8. AndroidStudio升级到2.3版本无法编译的解决方法

    上周五as提示更新,于是为了体验新功能还在编码过程中就迫不及待的点击了更新,公司网很快,十几分钟就下载好,然后一重启就懵逼了,提示是否更改依赖版本到2.3以及升级gradle到3.3,点了确定就一直在 ...

  9. [aaronyang] nodejs学习-mongodb[1]

    1.资源提供与安装(ayjs.net) 学习说明:nodejs还是在非windows环境下操作好,所以一切还是 当前时间:2014年12月06日aaronyang 官网地址:www.mongodb.o ...

  10. Oracle 12C -- sequence的新特性

    如果使用了全局临时表和sequence,有时会遇到一些问题.因为全局临时表与会话(或会话中的事务)相关,而sequence与数据库级别相关. 在12C中,可以创建一个sequence,其使用范围只是针 ...