九天雁翎的博客
如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。 -- Paul Graham

一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(4)二分搜索算法

一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(4)二分搜索算法

write by** 九天雁翎(JTianLing) –
blog.csdn.net/vagrxie
**

 

«Data Structures and Algorithm Analysis in C++»

--《数据结构与算法分析c++描述》 Mark Allen Weiss著 人民邮电大学出版 中文版第44面,图2-9二分搜索算法

二分搜索是很著名也很实用的算法,在排序中查找的速度从算法分析角度来说已经是最快的了。O(logN)

这里费了点心,将bash都实现了,扭曲啊,扭曲,光是传递一个数组参数都折腾了半天,最后还是通过所谓的间接引用然后用for重新赋值才实现我想要的数组,再次认为bash的算法描述语法混乱不堪。。。。其实bash只有命令调用的语法好用而已(个人见解),但是碰到我这样无聊的人,偏偏要用bash去实现算法。。。那就只能稍微偷点懒了,用了bash的C语言语法部分。

以下4个算法都是一样的,测试时为了统一结果,消除因为cpp,python数组从0开始,lua,bash数组从1开始的问题,测试时,cpp,python从-1开始测试。最后测试完成的结果完全一致,来个有意思的截图:

我编码的时候平铺4个putty窗口,正好占满我的19寸屏:)

从左自右依次是cpp,lua,python,bash。

以下是源代码:

CPP:

#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <iostream>
using  namespace  std;
template <typename  T>
int  binarySearch(const  vector<T> &a, const  T &x, int & aiTimes)
{
    int  low = 0;
    int  high = a.size() - 1;

    while(low <= high)
    {
        ++aiTimes;
        int mid = (low + high) / 2;
        
        if(a[mid] < x)
        {
            low = mid + 1;
        }
        else  if(a[mid] > x)
        {
            high = mid - 1;
        }
        else
        {
            return  mid;
        }
    }

    return  -1;
}

int  main(int  argc, char * argv[])
{
    vector<int > lveci;
    lveci.resize(100);
    for(int  i = 0; i < 100; ++i)
    {
        lveci[i] = i;
    }

    int  liTimes = 0;
    cout << binarySearch(lveci, -1, liTimes);
    cout <<"/tcost:" <<liTimes <<endl;
    liTimes = 0;
    cout << binarySearch(lveci, 0, liTimes);
    cout <<"/tcost:" <<liTimes <<endl;
    liTimes = 0;
    cout << binarySearch(lveci, 1, liTimes);
    cout <<"/tcost:" <<liTimes <<endl;
    liTimes = 0;
    cout << binarySearch(lveci, 2, liTimes);
    cout <<"/tcost:" <<liTimes <<endl;
    liTimes = 0;
    cout << binarySearch(lveci, 100, liTimes);
    cout <<"/tcost:"<<liTimes <<endl;



    exit(0);
}

LUA:

#!/usr/bin/env lua
function binarySearch(a, v)
    low = 1
    high = #a

    times = 0
    while(low <= high) do
        times = times + 1
        mid = math.floor(( low + high) / 2)
        if  a[mid] < v  then
            low = mid + 1
        elseif  a[mid] > v then
            high = mid - 1
        else
            return  mid,times
        end
    end

    return  -1,times
end

-- test code
array = {}
for  i=1,100 do
    array[i] = i
end

print(binarySearch(array, 0))
print(binarySearch(array, 1))
print(binarySearch(array, 2))
print(binarySearch(array, 3))
print(binarySearch(array, 101))

PYTHON:

#!/usr/bin/env python

def  binarySearch(a, v):
    low = 0
    high = len(a) - 1
    times = 0

    while  low <= high:
        times += 1
        mid = (low + high) // 2

        if  v > a[mid]:
            low = mid + 1
        elif  v < a[mid]:
            high = mid - 1
        else :
            return  mid,times
    
    return  -1,times

array = range(100)
print  binarySearch(array, -1)
print  binarySearch(array, 0)
print  binarySearch(array, 1)
print  binarySearch(array, 2)
print  binarySearch(array, 100)

BASH:

#!/usr/bin/env bash


binarySearch()
{
    v=$2
    an="$1[@]"
    a=${!an}
    for  i in  $a
    do
        ar[ i]= $i
    done
    low=1
    high=${#ar[*]}
    ((  times= 0 ))

    while  (( low <= high ))
    do
        ((  ++times  ))
        ((  mid=( low+high ) /2 ))
        #echo -n " mid="$mid
        #echo -n " ar[mid]="${ar[mid]}
        if  ((  v > ar[ mid ]  ))
        then
            ((  low =  mid \+ 1 ))
        elif  ((  v < ar[ mid ]  ))
        then
            ((  high =  mid \- 1 ))
        else
            #echo -e "/nTimes="$times
            return  $mid
        fi
    done

    #echo -e "/nTimes="$times
    return  -1
}

for  ((i= 1;  i<= 100;  ++i))
do
    ((  array[ i]  =  i  ))
done

binarySearch array 0
echo  -e  "$?/t$times"
binarySearch array 1
echo  -e  "$?/t$times"
binarySearch array 2
echo  -e  "$?/t$times"
binarySearch array 3
echo  -e  "$?/t$times"
binarySearch array 101
echo  -e  "$?/t$times"

exit  0

 

write by** 九天雁翎** (JTianLing) – www.jtianling.com

分类:  Lua  Python  算法 
标签:  Bash  C++  Lua  Python  《数据结构与算法分析-C++描述》  二分搜索 

Posted By 九天雁翎 at 九天雁翎的博客 on 2008年11月27日

前一篇: 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(3) 最大子序列和问题 后一篇: 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(5)欧几里得算法欧几里得算法求最大公约数