美文网首页
关于二分算法

关于二分算法

作者: 牛顿爱编程 | 来源:发表于2015-11-08 16:16 被阅读48次
1、常规二分

功能:有序数组中查找某个元素的位置。

int dichotomy_default(int[] A, final int target) {
        int result = -1;
        if (null == A || A.length == 0) {
            return result;
        }
        int left = 0, right = A.length - 1;
        while (left <= right) {
            final int mid = (left + right) / 2;
            if (target == A[mid]) {
                result = mid;
                break;
            } else if (target < A[mid]) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return result;
    }

2、二分拓展之一

有序数组中存在重复数值,找到某个数值在数组中出现的第一个或者最后一个位置。算法的核心是:在找到某个位置对应的数值与目标值相等时,判断是否继续向左或者向右移动。

int dichotomy_low(int[] A, final int target) {
        int result = -1;
        if (null == A || A.length == 0) {
            return result;
        }
        int left = 0, right = A.length - 1;
        while (left <= right) {
            final int mid = (left + right) / 2;
            if (target == A[mid]) {
                if ((mid > 0 && target != A[mid - 1]) || mid == 0) {
                    result = mid;
                    break;
                } else {
                    right = mid - 1;
                }
            } else if (target < A[mid]) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return result;
    }

int dichotomy_high(int[] A, final int target) {
        int result = -1;
        if (null == A || A.length == 0) {
            return result;
        }
        int left = 0, right = A.length - 1;
        while (left <= right) {
            final int mid = (left + right) / 2;
            if (target == A[mid]) {
                if ((mid < right && target != A[mid + 1]) || mid == right) {
                    result = mid;
                    break;
                } else {
                    left = mid + 1;
                }
            } else if (target < A[mid]) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return result;
    }
3、二分拓展之二

Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
算法的核心是:不论什么情况,总能在[left mid]和[mid right]两个区间中找到一个是单调的,这样就容易判断目标值在哪个区间,并且做出调整。

int dichotomy_hard(int[] A, final int target) {
        int result = -1;
        if (null == A || A.length == 0) {
            return result;
        }
        int left = 0, right = A.length - 1;
        while (left <= right) {
            final int mid = (left + right) / 2;
            if (target == A[mid]) {
                result = mid;
                break;
            } else if (A[left] <= A[mid]) {
                if (target >= A[left] && target < A[mid]) {
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
            } else {
                if (target > A[mid] && target <= A[right]) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
        }
        return result;
    }

4、二分拓展之三

拓展二的情况是数组中没有重复的数值出现,如果有重复的数值出现呢?其实在这种情况下,判断A[left] <= A[mid]的时候,相等的情况要单独去判断,如果相等只要left++即可。

int dichotomy_duplicate(int[] A, final int target) {
        int result = -1;
        if(null == A || A.length == 0) {
            return result;
        }
        int left = 0, right = A.length -1;
        while(left <= right) {
            final int mid = (left + right) / 2;
            if(target == A[mid]) {
                result = mid;
                break;
            }
            if(A[left] < A[mid]) {
                if(A[left] <= target && target < A[mid]) {
                    right = mid -1;
                } else {
                    left = mid + 1;
                }
            } else if(A[left] > A[mid]) {
                if(A[mid] < target && target <= A[right]) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            } else {
                left++;
            }
        }
        return result;
    }

相关文章

  • 算法-二分搜索算法

    算法:二分搜索算法(折半查找算法)时间复杂度: 二分搜索算法概述 二分搜索算法伪代码 二分搜索算法实现 二分搜索算...

  • 算法汇总

    关于算法: 基础技巧:分治、二分、贪心排序算法:快速排序、归并排序、计数排序搜索算法:回溯、递归、深度优先遍历,广...

  • 二分算法-LeetCode 69

    二分算法-LeetCode 69 二分算法 二分算法模板, 二分搜索即搜索一个数,如果存在,返回其索引,否则返回-...

  • 关于二分算法

    1、常规二分 功能:有序数组中查找某个元素的位置。 2、二分拓展之一 有序数组中存在重复数值,找到某个数值在数组中...

  • 二分查找

    姓名:毛浩 学号:17029250003 【嵌牛导读】关于算法中十分常见的二分查找。 【嵌牛鼻子】二分查找 【...

  • 『算法』『数据结构』 浅谈二分算法,理解程序员必懂必会的计算机常

    基本认识 二分算法,又名二分查找、折半查找,是一种查找算法,是最基础的,最简单易学且高效实用的算法之一。二分算法的...

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

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

  • 基本KMeans和二分Kmeans的python实现

    基本Kmeans算法 二分KMeans算法

  • 数据结构与算法之美笔记——二分查找(下)

    摘要: 基础的二分查找算法无论是概念还是实现都比较简单(关于 二分查找基础实现文章 可点击此处查看),但二分查找存...

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

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

网友评论

      本文标题:关于二分算法

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