常用算法

>>>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. iOS手势之pinch

    今天用地图的时候有用到pinch 捏合手势 通过捏合手势动作可以很轻松的来改变视图元素的一个比例 手势的动作状态有如下三种,一般是按照顺序来进行转换的. 1. UIGestureRecognizerS ...

  2. Gulp 的简单使用(原创)

    1.安装nodejs 安装省略 npm的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载.安装.上传以及管理已经安 ...

  3. 并行rsync

    #!/bin/bash ]; then echo -e "usage : \n\t$0 hostList src_file dst_path" echo -e "exam ...

  4. [array] leetcode - 33. Search in Rotated Sorted Array - Medium

    leetcode - 33. Search in Rotated Sorted Array - Medium descrition Suppose an array sorted in ascendi ...

  5. Android Weekly Notes Issue #288

    Android Weekly Issue #288 December 17th, 2017 Android Weekly Issue #288 本期内容主要包括介绍Kotlin DSL使用kotlin ...

  6. C++ 头文件系列(stdexcept)

    预定义异常类 这个头文件包含的内容非常简单,只包含9个异常类,均从exception类派生,因此我们用三张图来描述: 这里仅解释两点: overflow : 指值的大小超过 整型 变量能表示的范围,即 ...

  7. 通过 JS 实现简单的拖拽功能并且可以在特定元素上禁止拖拽

    前言 关于讲解 JS 的拖拽功能的文章数不胜数,我确实没有必要大费周章再写一篇重复的文章来吸引眼球.本文的重点是讲解如何在某些特定的元素上禁止拖拽.这是我在编写插件时遇到的问题,其实很多插件的拖拽功能 ...

  8. windows net 命令(转载)

    CMD-NET命令详解 net命令大全,net命令用法,net网络命令,net命令使用,net命令集,net命令介绍,net常用命令,net命令的使用技巧,net命令如何使用 大家在操作Windows ...

  9. 记vue API 知识点

    1. v-cloak指令:这个指令保持在元素上直到关联实例结束编译.和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标 ...

  10. 控制input 输入框的placeholder

    /*webkit placeholder居右*/ ::-webkit-input-placeholder { color: #e7e7e7; text-indent: .3rem; font-size ...