美文网首页干货
变形递增数列的二分查找算法

变形递增数列的二分查找算法

作者: bupt_huangwei | 来源:发表于2014-04-23 20:45 被阅读0次

Q

一个递增数列把后几项整体移动到最前面,移动几项并不知道,例如:数列123456789,移动后3项,数列变为789123456。对于这样的数列,给定一个数,查找该数在数列中的下标,如果不存在则返回-1。

A

算法分析

对于一个有序的数组,最快的是二分查找,时间复杂度是θ(logn)。本题只是二分查找的一个变形,所以可以以二分查找为基础,写出算法。

本题的关键是如何进行正确的递归,也就是判断key在哪一半中。函数newBs中对6种情况分别进行了判断,之后调用newBs或者bs进行递归。因为每一次递归只有常数次判断,所以最终的时间复杂度和二分查找是一样的,均是θ(logn)

C++实现

#include <iostream>
using namespace std;

int bs(const int *arr, int low, int high, int key)
{       
    int mid = low+(high-low)/2;
    if (low > high) {
        return -1;
    }
    if (arr[mid] == key) {
        return mid;
    } else if (arr[mid] > key) {
        return bs(arr, low, mid-1, key);
    } else
        return bs(arr, mid+1, high, key);
}

int newBs(const int *arr, int low, int high, int key)
{
    if (low > high)
        return -1;
    int mid = low+(high-low)/2;
    if (arr[mid] == key)
        return mid;
    if (arr[high] == key)
        return high;
    if (arr[low] == key)
        return low;
    
    if (key > arr[high]) {
        if (key < arr[mid]) {
            return bs(arr, low, mid-1, key);
        } else if (arr[mid] > arr[high]) {
            return newBs(arr, mid+1, high, key);
        } else {
            return newBs(arr, low, mid-1, key);
        }
    } else {
        if (key > arr[mid]) {
            return bs(arr, mid+1, high, key);
        } else if (arr[mid] < arr[high]) {
            return newBs(arr, low, mid-1, key);
        } else {
            return newBs(arr, mid+1, high, key);
        }
    }
}

int main(int argc, const char * argv[])
{
    const int arr[] = {10,11,16,1,2,3,4,5,6,7,8,9};
    int length = sizeof(arr)/sizeof(int);
    
    for (int i = 0; i < length; i++) {
        int result = newBs(arr, 0, length-1, arr[i]);
        cout << "result: " << result << endl;
    }

    return 0;
}

相关文章

  • 变形递增数列的二分查找算法

    Q 一个递增数列把后几项整体移动到最前面,移动几项并不知道,例如:数列123456789,移动后3项,数列变为78...

  • java算法之二分查找算法

    二分查找又称折半查找,它是一种效率较高的查找方法。、折半查找的算法思想:、将数列按有序化(递增或递减)排列,进行折...

  • 常用算法(1)-二分查找算法(非递归)

    1. 二分查找算法(非递归) 介绍 二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进...

  • 数据结构与算法——基础篇(六)

    常用10种算法 1、二分查找算法(非递归)——要求有序 二分查找法只适用于从有序的数列中进行查找(比如数字和字母等...

  • Objective-C实现二分查找和插值查找

    二分查找二分查找 又称折半查找,要求数组必须是有序的数列,是一种有序查找算法。二分查找的时间复杂度是O(log n...

  • 斐波那契查找算法

    算法原理: 斐波那契查找就是在二分查找的基础上根据斐波那契数列进行分割的。 构建一个斐波那契数列 扩展被查询数列:...

  • 算法-查找-二分查找变形

    经典的二分查找很好理解,也很好实现,那一起来看下二分查找的变形问题。常见的二分查找变形问题有: 查找第一个等于待查...

  • 数据结构和算法--二分查找

    二分查找 二分查找的思想 二分查找(Binary Search)算法,也叫折半查找算法。 二分查找针对的是一个有序...

  • 数据结构与算法系列——二分查找

    二分查找算法的简单介绍 今天我们来学习一下二分查找算法,也叫做折半查找算法。使用二分查找算法的前提是数据需要是有序...

  • 算法

    一.算法基础--算法的特性 二.算法基础--算法的复杂度 三.顺序查找和二分查找 顺序查找 二分查找(前提是有序的...

网友评论

    本文标题:变形递增数列的二分查找算法

    本文链接:https://www.haomeiwen.com/subject/yhtrtttx.html