常见查找算法之php, js,python版
常用算法
>>>1. 顺序查找, 也叫线性查找, 它从第一个记录开始, 挨个进行对比, 是最基本的查找技术
javaScript 版顺序查找算法:
// 顺序查找(线性查找) 只做找到即返回
// javaScript 版
function search(data,needle)
{
for(var i=0;i<data.length;i++)
{
if(data[i] == needle && typeof data[i] == typeof needle)
{
return i;
}
}
return false;
}
var data = [100,10,2,7,8,6];
console.log(search(data,7));//
console.log(search(data,'7'));// false
php版顺序查找算法:
<?php
// php版
function search($data,$needle)
{
$data_len = count($data);
for($i=0;$i<$data_len;$i++)
{
if($data[$i] === $needle) return $i;
}
return false;
}
$data = [100,10,2,7,8,6];
var_dump(search($data,7));// int(3)
var_dump(search($data,'7'));// bool(false)
python3 版顺序查找算法:
# python3 版本
def search(data,needle) :
dataLen = len(data)
for i in range(dataLen) :
if data[i] == needle and type(data[i]) == type(needle) : return i
return False
data = [100,10,2,7,8,6]
print(search(data,7)) #
print(search(data,'')) # False
print(search(data,6)) #
>>>二分找查, 折半查找
核心思想:
1. 用low , high , middle 表示待查找区间的 下界, 上界,中间 的坐标
2. 取中间位置 middle = floor((low+high)/2)
3. 用给定值与 中间位置的值 作比较
等于: 查找成功
大于: 待查数据在区间的后半段 设low 为 middle+1
小于: 待查数据在区间的前半段 设high 为 middle-1
4.数据是排序好的
5.直到越界 (low>high) 查找失败, 结束


PHP版二分查找算法:
<?php
// 二分法 折半查找 PHP版
$data_list = [1,2,4,5,5,6,10,12];
function bisearch($data_list,$needle)
{
$low = 0;
$high = count($data_list)-1;
if($data_list[$low] == $needle) return $low;
if($data_list[$high] == $needle) return $high;
while($high>=$low)
{
$middle = floor(($low+$high)/2);
if($needle == $data_list[$middle])
{
return $middle;
}elseif($needle>$data_list[$middle])
{
$low = $middle+1;
}else{
$high = $middle-1;
}
}
return false;
}
print_r(bisearch($data_list,10)); //
print_r(bisearch($data_list,5)); //
print_r(bisearch($data_list,13)); // false
python 3版 二分查找算法:
import math
# python3 版二分查找算法
def bisearch(data_list,needle) :
low,high = 0,len(data_list)-1
if needle == data_list[low] : return low
if needle == data_list[high] : return high
while high>=low :
middle = math.floor((high+low)/2)
if needle == data_list[middle] : return middle
elif needle > data_list[middle] : low = middle+1
else : high = middle-1
return False
data_list = [1,2,4,5,5,6,10,12]
print(bisearch(data_list,10)); #
print(bisearch(data_list,5)); #
print(bisearch(data_list,13)); # False
javaScript 版二分查找算法:
// js 版二分查找
function bisearch(data_list,needle)
{
var low = 0,high = data_list.length-1
if (needle == data_list[low] ) return low
if (needle == data_list[high]) return high
while (high>=low)
{
var middle = Math.floor((low+high)/2)
if(needle == data_list[middle])
{
return middle
}else if(needle>data_list[middle])
{
low = middle + 1
}else{
high = middle - 1
}
}
return false
}
data_list = [1,2,4,5,5,6,10,12]
console.log(bisearch(data_list,10)); //
console.log(bisearch(data_list,5)); //
console.log(bisearch(data_list,13)); // False
>>> 插值查找 (由二分查找改进)
二分查找的公式:
middle = (low+high)/2 => low+(1/2)*(high-low)
插值查找的公式由上面演变, 主要改进的是二分之一部分:
middle = low+((needle-data[low])/(data[high]-data[low]))*(high-low)

对二分查找跟插值查找的一个说明:
插值查找对于公布均匀的数据, 速度比二分查找快(插值查找次数少),例如对下面这类数据
$data = [1,2,3,6,7,9,10,11,...]
对于分布不均匀的数据, 二分查找要比插值查找快 例如下:
$data = [4,100,300,685,3452,...]
PHP版 插值查找算法:
<?php
// 二分查找优化(插值查找) PHP版
$data_list = [1,2,4,5,5,6,10,12];
function interpolation($data_list,$needle)
{
$low = 0;
$high = count($data_list)-1;
if($data_list[$low] == $needle) return $low;
if($data_list[$high] == $needle) return $high;
while($high>=$low)
{
$middle = floor($low+(($needle-$data_list[$low])/($data_list[$high]-$data_list[$low]))*($high-$low));
if($needle == $data_list[$middle])
{
return $middle;
}elseif($needle>$data_list[$middle])
{
$low = $middle+1;
}else{
$high = $middle-1;
}
}
return false;
}
print(interpolation($data_list,10)); //
print(interpolation($data_list,5)); //
print(interpolation($data_list,13)); // false
$index = interpolation($data_list,10);
echo $data_list[$index];//
/*
注: 1.floor 返回的是浮点数 如 6 类型为float
2.false 用print,echo 输出是空字符串
*/
python3版 插值查找算法:
import math
# python3 插值查找算法
def interpolation(data_list,needle) :
low,high = 0,len(data_list)-1
if needle == data_list[low] : return low
if needle == data_list[high] : return high
while high>=low :
middle = math.floor(
low+
((needle-data_list[low])/(data_list[high]-data_list[low]))*
(high-low)
)
if needle == data_list[middle] : return middle
elif needle > data_list[middle] : low = middle+1
else : high = middle-1
return False
data_list = [1,2,4,5,5,6,10,12]
print(interpolation(data_list,10)); #
print(interpolation(data_list,5)); #
print(interpolation(data_list,13)); # False
js 版插值查找算法:
// js版 插值查找算法
function interpolation(data_list,needle)
{
var low = 0,high = data_list.length-1
if (needle == data_list[low] ) return low
if (needle == data_list[high]) return high
while (high>=low)
{
var middle = Math.floor(
low+((needle-data_list[low])/(data_list[high]-data_list[low]))*
(high-low)
)
if(needle == data_list[middle])
{
return middle
}else if(needle>data_list[middle])
{
low = middle + 1
}else{
high = middle - 1
}
}
return false
}
data_list = [1,2,4,5,5,6,10,12]
console.log(interpolation(data_list,10)); //
console.log(interpolation(data_list,5)); //
console.log(interpolation(data_list,13)); // False
小结:
以上有php,python,js 版常见的查找算法:
1. 顺序(线性) 查找
2. 二分查找 (折半查找)
3. 插值查找 (二分查找优化 适用于分布均匀的数据)
4. 前提是数据排好序, 顺序
常见查找算法之php, js,python版的更多相关文章
- 常见排序算法原理及JS代码实现
目录 数组 sort() 方法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 堆排序 快速排序 创建时间:2020-08-07 本文只是将作者学习的过程以及算法理解进行简单的分享,提供多一个角度的 ...
- 常见查找算法(Java代码实现)
一,顺序查找 查找算法中顺序查找算是最简单的了,无论是有序的还是无序的都可以,只需要一个个对比即可,但其实效率很低.我们来看下代码 public static int search(int[] a, ...
- 排序算法(C语言+Python版)宝宝再也不怕面试官写排序算法了
直接插入排序 过程: 1. 数据可分看成两个部分,前面的数据是有序的 2. 从后面的数据取出一个元素,插到前面有序数据的合适位置 从右端开始查找,到找到比此元素大的时候,则此元素向后移动,以空出多余的 ...
- 算法:冒泡排序(python版)
1.将n个元素从大到小排序后,选择第k个大的元素 #!/usr/bin/env python #coding -*- utf:8 -*- #冒泡排序选第k个元素 import random impor ...
- Java基础知识强化61:经典查找之 常见查找算法小结
一.顺序查找 条件:无序或有序队列. 原理:按顺序比较每个元素,直到找到关键字为止. 时间复杂度:O(n) 二.二分查找(折半查找) 条件:有序数组 原理:查找过程从数组的中间元素开始,如果中间元素正 ...
- 算法两数之和 python版
方法一.暴力解法 -- 5s 复杂度分析:时间复杂度:O(n^2)空间复杂度:O(1) length = len(nums)for i in range(length): for j in ra ...
- 常见排序算法(JS版)
常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html <! ...
- 二分查找算法(Python版)
[本文出自天外归云的博客园] 记性不好(@.@),所以平时根本用不到的东西就算学过如果让我去想也会需要很多时间(*.*)! 二分查找算法 在一个有序数组中查找元素最快的算法,也就是折半查找法,先找一个 ...
- 【数据结构与算法Python版学习笔记】查找与排序——散列、散列函数、区块链
散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度. 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为" ...
随机推荐
- Html 段落自动换行
1.段落换行 在 Html 中,关于段落换行,是我们经常遇见的问题,那么正如我下图没加换行代码所示: 在网页上的显示的样式,是这样的: 你可以看见,原本的样式,不会自动换行.在 div 中,加入一个样 ...
- 如何通过Mock API提高APP开发效率?
APP开发过程中,如果可以在客户端的正常项目代码中,自然地(不影响最终apk)添加一种模拟服务器数据返回的功能,这样就可以很方便的在不依赖服务器的情况下展开客户端的开发. Mock API提供了这一问 ...
- vue2.0---vue-router总结(项目基于vue-cli)
vue2.0---vue-router总结(项目基于vue-cli) 1. 在项目中安装: npm install vue-router --save 2. 在项目中的引入: // The Vue b ...
- javascript中的异步 macrotask 和 microtask 简介
javascript中的异步 macrotask 和 microtask 简介 什么是macrotask?什么是microtask?在理解什么是macrotask?什么是microtask之前,我们先 ...
- 《写给大家看的设计书(第3版)》【PDF】下载
<写给大家看的设计书(第3版)>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196355 内容简介 <写给大家看的设计书&g ...
- iOS 环信透传cmd消息多次重复接收,解决办法
由于项目需求,需要在项目中接到消息的时候做不同界面的不同的操作,哪儿需要哪儿就要添加代理:引起代理事件重复执行:所以要在VC显示的时候添加代理,消失的时候删除代理 环信 透传 消息多次接收情况(由于代 ...
- Wincc flexable的数据记录的组态
1.数据记录就是将PLC采集的数据记录下来如下,注意只有TP270和OP270以上的HMI设备才有数据记录 2.练习展示 3.开始创建数据记录 4.组态数据记录 5.组态变量的记录属性.将数据记录和变 ...
- 童话故事 --- CPU的贴身侍卫ITCM和ICache
"叮铃铃- 叮铃铃-" "谁呀?"黛丝博士打开了家门,"哇,高飞,你怎么来了?" 高飞狗:"好久不见,想来看看你,还买了你最喜欢吃 ...
- js知识点记录
1.for...in:用于遍历数组或对象的属性. for(var prop in obj){console.log(obj[prop])}; 该循环遍历对于对象属性是无序的,可能是因为obj本来就是无 ...
- 轻量级quill富文本编辑器
因为公司产品需要在移动端编辑文本,所以发现了这个轻量级的好东西,网上也没找到比较好的案例,就自己总结了下,有兴趣的直接复制代码运行看看就知道啦! 下面是quill.js的CDN加速地址: <!- ...