算法 - 高级二分查找

本贴最后更新于 1784 天前,其中的信息可能已经时过境迁

概述

二分查找(binary search),也称折半搜索,是一种在 有序数组查找某一特定元素 的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

  • 时间复杂度:折半搜索每次把搜索区域减少一半,时间复杂度为 O(log n)。(n 代表集合中元素的个数)
  • 空间复杂度: O(1)。虽以递归形式定义,但是尾递归,可改写为循环。

动图演示

图片来源:百度

algorithmbinarysearch.gif

优缺点

优点

查找速度快,平均性能好

缺点

必须为 有序 数组

使用场景

1.优惠券

优惠券最优算法,最优惠的券降序排列,同等优惠的券按覆盖范围优先级升序

  • 券使用范围
    • 单品券
    • 品类券
    • 品牌券

思路

1.获取用户可用券
2.从 redis 筛选出当前可用券的使用范围
3.根据购买的商品检索(二分查找)是否命中
4.计算命中券的优惠额度
5.快速排序算法降序

公式

  • 算法一: mid = (low + high) / 2
  • 算法二: mid = low + (high – low)/2

代码

/**
 * ===============================
 * 作者:amos lam
 * 时间:2020年1月3日下午9:39:09
 * 备注:高级二分查找
 * ===============================
 */
public class BinarySearch {

	public static int binarySearch(int[] a, int num) {
		
		int len = a.length;
		int high = len - 1;
		int low = 0;
		while (low <= high) {
			
			int mid = (high + low) >> 1;
			if (a[mid] == num) {
				
				return mid;
			}else if (a[mid] < num) {
				
				low = mid + 1;
			}else {
				
				high = mid - 1;
			}
		}
		return -1;
	}

	public static void main(String[] args) {

		int[] a = {1,10,30,34,40,45,59};
		int index = binarySearch(a, 30);
		
        System.out.println(index);
	}
}

公共包代码

调用 java.util.Arrays 包的 binarySearch 方法

import java.util.Arrays;

/**
 * ===============================
 * 作者:amos lam
 * 时间:2020年1月3日下午9:39:09
 * 备注:高级二分查找
 * ===============================
 */
public class BinarySearch {

	public static void main(String[] args) {

		int[] a = {1,10,30,34,40,45,59};
		int index = Arrays.binarySearch(a, 30);
		
        System.out.println(index);
	}
}
  • 算法
    428 引用 • 254 回帖 • 24 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...