顺序查找

适用范围:

没有进行排序的数据序列

缺点:

速度非常慢, 效率为O(N)

//实现
template <typename Type>
Type *sequenceSearch(Type *begin, Type *end, const Type &searchValue)
throw(std::range_error)
{
    if ((begin == end) || (begin == NULL) || (end == NULL))
        throw std::range_error("pointer unavailable");

    for (Type *index = begin; index < end; ++index)
    {
        if (*index == searchValue)
            return index;
    }

    return end;
}

template <typename Type>
Type *sequenceSearch(Type *array, int length, const Type &searchValue)
throw(std::range_error)
{
    return sequenceSearch(array, array+length, searchValue);
}

迭代二分查找

应用范围:

数据必须首先排序,才能应用二分查找;效率为(logN)

算法思想:

譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:

1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,

2.寻找{6, 7, 8, 9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下6,即找到了。

二分查找算法就是不断将数组进行对半分割,每次拿中间元素和目标元素进行比较。

//实现:迭代二分
template <typename Type>
Type *binarySearch(Type *begin, Type *end, const Type &searchValue)
throw(std::range_error)
{
    if ((begin == end) || (begin == NULL) || (end == NULL))
        throw std::range_error("pointer unavailable");

    /**注意:此处high为end-1,并不是end
        因为在后续的查找过程中,可能会如下操作 (*high), 或等价的操作
        此时应该访问的是最后一个元素, 必须注意不能对数组进行越界访问!
    */
    Type *low = begin, *high = end-1;
    while (low <= high)
    {
        //计算中间元素
        Type *mid = low + (high-low)/2;
        //如果中间元素的值==要找的数值, 则直接返回
        if (*mid == searchValue)
            return mid;
        //如果要找的数比中间元素大, 则在数组的后半部分查找
        else if (searchValue > *mid)
            low = mid + 1;
        //如果要找的数比中间元素小, 则在数组的前半部分查找
        else
            high = mid - 1;
    }

    return end;
}

template <typename Type>
Type *binarySearch(Type *array, int length, const Type &searchValue)
throw(std::range_error)
{
    return binarySearch(array, array+length, searchValue);
}

递归简介

递归就是递归...(自己调用自己),递归的是神,迭代的是人;

递归与非递归的比较

//递归求解斐波那契数列
unsigned long ficonacciRecursion(int n)
{
    if (n == 1 || n == 2)
        return 1;
    else
        return ficonacciRecursion(n-1) + ficonacciRecursion(n-2);
}
//非递归求解斐波那契数列
unsigned long ficonacciLoop(int n)
{
    if (n == 1 || n == 2)
        return 1;

    unsigned long  first = 1, second = 1;
    unsigned long  ans = first + second;
    for (int i = 3; i <= n; ++i)
    {
        ans = first + second;
        first = second;
        second = ans;
    }

    return ans;
}

递归二分查找

算法思想如同迭代二分查找;

//实现
template <typename Type>
Type *binarySearchByRecursion(Type *front, Type *last, const Type &searchValue)
throw(std::range_error)
{
    if ((front == NULL) || (last == NULL))
        throw std::range_error("pointer unavailable");

    if (front <= last)
    {
        Type *mid = front + (last-front)/2;
        if (*mid == searchValue)
            return mid;
        else if (searchValue > *mid)
            return binarySearchByRecursion(mid+1, last, searchValue);
        else
            return binarySearchByRecursion(front, mid-1, searchValue);
    }

    return NULL;
}

template <typename Type>
int binarySearchByRecursion(Type *array, int left, int right, const Type &searchValue)
throw (std::range_error)
{
    if (array == NULL)
        throw std::range_error("pointer unavailable");

    if (left <= right)
    {
        int mid = left + (right-left)/2;
        if (array[mid] == searchValue)
            return mid;
        else if (searchValue < array[mid])
            return binarySearchByRecursion(array, left, mid-1, searchValue);
        else
            return binarySearchByRecursion(array, mid+1, right, searchValue);
    }

    return -1;
}

小结:

其实C++ 的STL已经实现好了std::binary_search(),在用的时候我们只需调用即可, 但是二分算法的思想还是非常重要的, 在求解一些较为复杂的问题时, 我们时常能够看到二分的身影.

数据结构基础(2) --顺序查找 & 二分查找的更多相关文章

  1. PHP实现文本快速查找 - 二分查找

    PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...

  2. 【转】Java实现折半查找(二分查找)的递归和非递归算法

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wintys.blog.51cto.com/425414/94051 Java二分 ...

  3. 数据结构实验7:实现二分查找、二叉排序(查找)树和AVL树

    实验7 学号:      姓名:     专业: 7.1实验目的 (1) 掌握顺序表的查找方法,尤其是二分查找方法. (2) 掌握二叉排序树的建立及查找. 查找是软件设计中的最常用的运算,查找所涉及到 ...

  4. 查找算法(I) 顺序查找 二分查找 索引查找

    查找 本文为查找算法的第一部分内容,包括了基本概念,顺序查找.二分查找和索引查找.关于散列表和B树查找的内容,待有空更新吧. 基本概念 查找(search)又称检索,在计算机上对数据表进行查找,就是根 ...

  5. 顺序查找&二分查找&索引查找

    1.查找技术的分类.如下图: 2.什么是顺序查找呢?(无序表) 顺序查找的原理很简单,就是遍历整个列表,逐个进行记录的关键字与给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录.如 ...

  6. mooc《数据结构》 习题1.8 二分查找

    本题要求实现二分查找算法. 函数接口定义: Position BinarySearch( List L, ElementType X ); 其中List结构定义如下: typedef int Posi ...

  7. MOOC 数据结构 01-复杂度3 二分查找

    01-复杂度3 二分查找(20 分) 本题要求实现二分查找算法. 函数接口定义: Position BinarySearch( List L, ElementType X ); 其中List结构定义如 ...

  8. JAVA查找--[二分查找]

    package com.array; public class BinaryFind { /* * 项目名称:二分查找 ; * 项目要求:用JAVA对数组进行查找,并运用快速查找算法; * 作者:Se ...

  9. leetcode旋转数组查找 二分查找的变形

    http://blog.csdn.net/pickless/article/details/9191075 Suppose a sorted array is rotated at some pivo ...

随机推荐

  1. MySQL备忘录

    1 数据库概念(了解) 1.1 什么是数据库 数据库就是用来存储和管理数据的仓库! 数据库存储数据的优先: l 可存储大量数据: l 方便检索: l 保持数据的一致性.完整性: l 安全,可共享: l ...

  2. 数据库的case when 使用实例

    本文作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan/article/details/50471210 需求很简单,我有一个部门和部门的请假申请表.表数据简 ...

  3. 初识gd库

    必备基础 开启GD拓展 列表使用 获取图片信息代码 图片详细信息 特效函数 示例 运行结果 分析 获取图片基本信息 获取图片宽度 获取图片高度 获取图片后缀名 获取图片mime类型 操作图片 添加文字 ...

  4. Apache shiro集群实现 (八) web集群时session同步的3种方法

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  5. Android捕获全局异常

    Android捕获全局异常 程序避免不了出现bug,导致程序崩溃,为了尽量不影响用户体验,可以全局捕获异常 效果图 异常捕获处理前 异常捕获处理后(将程序重新启动) 捕获异常的工具类 package ...

  6. Spark技术内幕: 如何解决Shuffle Write一定要落盘的问题?

    在Spark 0.6和0.7时,Shuffle的结果都需要先存储到内存中(有可能要写入磁盘),因此对于大数据量的情况下,发生GC和OOM的概率非常大.因此在Spark 0.8的时候,Shuffle的每 ...

  7. Kafka系列之-Kafka入门

    接下来的这些博客,主要内容来自<Learning Apache Kafka Second Edition>这本书,书不厚,200多页.接下来摘录出本书中的重要知识点,偶尔参考一些网络资料, ...

  8. Android Multimedia框架总结(五)多媒体基础概念

    转载请把头部出处链接和尾部二维码一起转载,本文出自: http://blog.csdn.net/hejjunlin/article/details/52431887 上篇中介绍了MediaPlayer ...

  9. x264源代码简单分析:滤波(Filter)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  10. 有两个序列A和B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A和B都按升序排列。对于1<=i,j<=k,求k个最小的(ai+bj)。要求算法尽量高效。

    有两个序列A和B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A和B都按升序排列.对于1<=i,j<=k,求k个最小的(ai+bj).要求算法尽量高效. int * ...