常用算法

>>>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版的更多相关文章

  1. 常见排序算法原理及JS代码实现

    目录 数组 sort() 方法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 堆排序 快速排序 创建时间:2020-08-07 本文只是将作者学习的过程以及算法理解进行简单的分享,提供多一个角度的 ...

  2. 常见查找算法(Java代码实现)

    一,顺序查找 查找算法中顺序查找算是最简单的了,无论是有序的还是无序的都可以,只需要一个个对比即可,但其实效率很低.我们来看下代码 public static int search(int[] a, ...

  3. 排序算法(C语言+Python版)宝宝再也不怕面试官写排序算法了

    直接插入排序 过程: 1. 数据可分看成两个部分,前面的数据是有序的 2. 从后面的数据取出一个元素,插到前面有序数据的合适位置 从右端开始查找,到找到比此元素大的时候,则此元素向后移动,以空出多余的 ...

  4. 算法:冒泡排序(python版)

    1.将n个元素从大到小排序后,选择第k个大的元素 #!/usr/bin/env python #coding -*- utf:8 -*- #冒泡排序选第k个元素 import random impor ...

  5. Java基础知识强化61:经典查找之 常见查找算法小结

    一.顺序查找 条件:无序或有序队列. 原理:按顺序比较每个元素,直到找到关键字为止. 时间复杂度:O(n) 二.二分查找(折半查找) 条件:有序数组 原理:查找过程从数组的中间元素开始,如果中间元素正 ...

  6. 算法两数之和 python版

    方法一.暴力解法 -- 5s 复杂度分析:时间复杂度:O(n^2)空间复杂度:O(1) length = len(nums)for i in range(length):    for j in ra ...

  7. 常见排序算法(JS版)

    常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html <! ...

  8. 二分查找算法(Python版)

    [本文出自天外归云的博客园] 记性不好(@.@),所以平时根本用不到的东西就算学过如果让我去想也会需要很多时间(*.*)! 二分查找算法 在一个有序数组中查找元素最快的算法,也就是折半查找法,先找一个 ...

  9. 【数据结构与算法Python版学习笔记】查找与排序——散列、散列函数、区块链

    散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度. 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为" ...

随机推荐

  1. Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'name': was expecting ('true', 'false' or 'null')

    Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'name': was expecting ( ...

  2. CentOS 7 学习(三)配置Tomcat集群

    所谓集群,就是把多台服务器集合起来,对外提供一个接口访问,对用户来说完全透明,常用的办法就是前端放一个服务器,将用户请求分发到不同的服务器,大致有以下几种方案 1)采取DNS轮询:将用户的连接解析到不 ...

  3. 《TCP-IP详解卷2:实现》【PDF】下载

    <TCP-IP详解卷2:实现>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062539 内容简介 <TCP/IP详解·卷2 ...

  4. ajaxFileUpload上传文件简单示例

    写在前面: 上传文件的方式有很多,最近在做项目的时候,一开始也试用了利用jquery的插件ajaxFileUpload来上传大文件,下面,用一个上传文件的简单例子,记录下,学习的过程~~~ 还是老样子 ...

  5. 来腾讯云开发者实验室 学习.NET

    腾讯云开发者实验室为开发者提供了一个零门槛的在线实验平台,开发者实验室提供的能力: 零门槛扫码即可免费领取实验机器,支持使用自有机器参与,实验完成后支持保留实验成果: 在线 WEB IDE 支持 sh ...

  6. NP完整性| 集1(简介)

    我们一直在写关于高效算法来解决复杂问题,如最短路径,欧拉图,最小生成树等.这些都是算法设计者的成功故事. 在这篇文章中,讨论了计算机科学的失败故事. 计算机可以解决所有的计算问题吗? 存在计算问题,即 ...

  7. 添加MD5 密码加密

        编辑 /etc/grub/grub.conf 配置文件 password = 123456 password --md5 $5$H.........SS grub-crypt  --md5   ...

  8. My Go Resolutions for 2017(from Russ cox's blog)

    我的2017年Go决议 一年之季始于春,我认为写一些今年我希望在Go上做的东西是有意义的. 我每年的目标是帮助Go开发人员.我想确保我们在Go团队中所做的工作对Go开发者有重大的积极影响.可能听起来很 ...

  9. Python 为何能坐稳 AI 时代头牌语言

    原文链接:https://mp.weixin.qq.com/s?__biz=MzI0ODcxODk5OA==&mid=2247487055&idx=2&sn=ca0fe8740 ...

  10. 不写一行代码,利用常用工具和软件批量下载URL资源

    有时候会遇到这种情况:想从某个网站下载一批东西,目标URL是比较规整的,而且结构都一样(仅某些字段不同).但又懒得开IDE专门写个脚本去弄,今天就和大家分享一下,如何利用手边常用的软件和工具,不用写一 ...