算法思想 您所在的位置:网站首页 二分法采用了什么算法思想 算法思想

算法思想

2024-07-13 06:45| 来源: 网络整理| 查看: 265

本文主要介绍算法思想中分治算法重要的二分法,比如二分查找;二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 二分查找 正常实现 public int binarySearch(int[] nums, int key) { int l = 0, h = nums.length - 1; while (l key) { h = m - 1; } else { l = m + 1; } } return -1; } 时间复杂度

二分查找也称为折半查找,每次都能将查找区间减半,这种折半特性的算法时间复杂度都为 O(logN)。

m 计算

有两种计算中值 m 的方式:

m = (l + h) / 2

m = l + (h - l) / 2

l + h 可能出现加法溢出,最好使用第二种方式。

返回值

循环退出时如果仍然没有查找到 key,那么表示查找失败。可以有两种返回值:

-1: 以一个错误码表示没有查找到 key

l: 将 key 插入到 nums 中的正确位置

二分查找变种

二分查找可以有很多变种,变种实现要注意边界值的判断。例如在一个有重复元素的数组中查找 key 的最左位置的实现如下:

public int binarySearch(int[] nums, int key) { int l = 0, h = nums.length - 1; while (l < h) { int m = l + (h - l) / 2; if (nums[m] >= key) { h = m; } else { l = m + 1; } } return l; }

该实现和正常实现有以下不同:

循环条件为 l < h

h 的赋值表达式为 h = m

最后返回 l 而不是 -1

在 nums[m] >= key 的情况下,可以推导出最左 key 位于 [l, m] 区间中,这是一个闭区间。h 的赋值表达式为 h = m,因为 m 位置也可能是解。

在 h 的赋值表达式为 h = mid 的情况下,如果循环条件为 l = key 111 nums[m]>= key ...

当循环体退出时,不表示没有查找到 key,因此最后返回的结果不应该为 -1。为了验证有没有查找到,需要在调用端判断一下返回位置上的值和 key 是否相等。

求开方

69. Sqrt(x) (Easy)

Input: 4 Output: 2 Input: 8 Output: 2 Explanation: The square root of 8 is 2.82842..., and since we want to return an integer, the decimal part will be truncated.

一个数 x 的开方 sqrt 一定在 0 ~ x 之间,并且满足 sqrt == x / sqrt。可以利用二分查找在 0 ~ x 之间查找 sqrt。

对于 x = 8,它的开方是 2.82842...,最后应该返回 2 而不是 3。在循环条件为 l



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有