常用查找算法(Java)
常用查找算法(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)的更多相关文章
- C++ STL 常用查找算法
C++ STL 常用查找算法 adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. ...
- 二分查找算法java实现
今天看了一下JDK里面的二分法是实现,觉得有点小问题.二分法的实现有多种今天就给大家分享两种.一种是递归方式的,一种是非递归方式的.先来看看一些基础的东西. 1.算法概念. 二分查找算法也称为折半搜索 ...
- 常用排序算法java实现
写在前面:纸上得来终觉浅.基本排序算法的思想,可能很多人都说的头头是到,但能说和能写出来,真的还是有很大区别的. 今天整理了一下各种常用排序算法,当然还不全,后面会继续补充.代码中可能有累赘或错误的地 ...
- 二分查找算法java
二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元 ...
- 常用排序算法--java版
package com.whw.sortPractice; import java.util.Arrays; public class Sort { /** * 遍历一个数组 * @param sor ...
- STL常用查找算法介绍
adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. #include <io ...
- C语言实现常用查找算法——二分查找
#include<stdio.h> void insert_sort(int a[],int n); int binary_search(int a[],int x,int n); voi ...
- python实现常用查找算法
http://www.cnblogs.com/feixuelove1009/p/6148357.html
- C++进阶 STL(3) 第三天 函数对象适配器、常用遍历算法、常用排序算法、常用算数生成算法、常用集合算法、 distance_逆序遍历_修改容器元素
01昨天课程回顾 02函数对象适配器 函数适配器是用来让一个函数对象表现出另外一种类型的函数对象的特征.因为,许多情况下,我们所持有的函数对象或普通函数的参数个数或是返回值类型并不是我们想要的,这时候 ...
随机推荐
- js触摸事件
touch事件的绑定 电脑端的mouseDown,mouseUp,mouseMove分别对应移动端的touchstart,touchend,touchmove 下面的代码判断浏览器是电脑端还是移动端, ...
- [转]HTML DIV+CSS 命名规范大全
原文链接 常用DIV+CSS命名大全集合,即CSS命名规则 我们开发CSS+DIV网页(Xhtml)时候,比较困惑和纠结的事就是CSS命名,特别是新手不知道什么地方该如何命名,怎样命名才是好的方法. ...
- IO 多路复用是什么意思?
在同一个线程里面, 通过拨开关的方式,来同时传输多个I/O流, (学过EE的人现在可以站出来义正严辞说这个叫“时分复用”了). 什么,你还没有搞懂“一个请求到来了,nginx使用epoll接收请求的过 ...
- 彻底解决asp.net mvc5.2.2:vs2013 cshtml视图文件报错(当前上下文中不存在名称“model”,ViewBag,Url)
最近遇到一个奇葩的问题,在vs2013下cshtml视图文件报错,出现当前上下文中不存在名称“model”,ViewBag,Url等等),在视图中也没有智能提示了,用@model声明视图的model类 ...
- java JDK JRE 1.6,1.7,1.8各个版本版本下载链接
有时想找jdk的某个版本并不太好找,在此给出所有链接及对应的api JavaSE 1.6各个版本 jdk api http://www.Oracle.com/technetwork/Java/jav ...
- 【struts2】自定义更强大的logger拦截器
Struts2自带的logger拦截器只是打印出了Action所对应的URL以及执行的方法名称,这对实际开发来说是肯定不够的.实际开发中为了调试方便,要记录的信息比较多,通常需要把这次请求相关的几乎所 ...
- Hive编程指南
- JAVA中如何将一个json形式的字符串转为json对象
import java.io.*; import org.json.*; public class Demo { public static void main(String[] args) thro ...
- Java中类的设计技巧
1) 一定要将数据设计为私有: 不要破坏封装性.有时需要编写一个访问器或更改器方法,但是最好还是保持实例域的私有性.数据的表示形式可能会改变,但他们的使用方式却不会经常发生变化.当数据保持私有时,他 ...
- Oracle 12C -- Invisible Columns
在12C中,当一个列被定义为"不可见"的时候,没有直接访问该列的sql语句是无法看到"不可见列"的,显式引用"不可见列"的语句是可以访问和操 ...