【算法图解】读书笔记:第1章 算法简介

news/2024/7/16 9:10:09

算法是一组完成任务的指令,任何代码片段都可视为算法。

二分查找


什么是二分查找

二分查找是一种算法,其输入的是一个有序的元素列表。如果要查找的元素包含在列表中,二分查找返回其位置,负责返回null。

假设要在电话簿中查找一个名字K打头或O打头的人,可以从A打头的部分开始查询,但更合乎逻辑的做法是从中间开始查找。解决这类问题可以通过二分查找。

例如:在0 - 100中,查找某个数的位置,最佳方法是按照50,75 这种方式去询问。

对于一个包含n个元素的列表,用二分查找最多需要 (log2 n) 步,而简单查找(遍历)最多需要n步。

因为我想乘此机会实战使用python,所以这个系列的文章中所有算法都会用JavaScript与python各实现一遍。

JavaScript 实现:

// 在一个有序的数组中(数组每个值等于其下标),从中搜索出目标数字。
const length = 1000000;
const list = Array.from({ length }).map((current, index) => index); // 创建数组
const target = Math.floor(Math.random() * length); // 创建目标数字

// 简单查找,按照下标一次循环遍历,输出最后的值
function simpleLookup(list, target) {
  const length = list.length;
  for(let i = 0; i < length; i++) {
    if(list[i] === target) return `simpleLookup ${list[i]}`
  }
  return false;
}

// 二分查找
function binarySearch(list, target) {
  let low = 0; // 最小的下标
  let high = list.length - 1; // 最大的下标
  while(low <= high) { // 判断条件,缩小至只包含一个元素
    let mid = Math.floor((low + high) / 2); // 中间下标
    let guess = list[mid]; // 中间下标的实际值
    if(guess === target)  return `binarySearch ${guess}`;
    else if(guess > target)  high = mid - 1; //  猜的数字大了,调小high
    else  low = mid + 1; // 猜的数字小了,调大low
  }
  return false;
}

console.time('simpleLookup');
simpleLookup(list, target);
console.timeEnd('simpleLookup');

console.time('binarySearch');
binarySearch(list, target);
console.timeEnd('binarySearch');

// 环境: node.js v10.4.1
// target 461672
// simpleLookup: 2.244ms
// binarySearch: 0.192ms
复制代码

例子的最后我放了一次我的运行结果,可以看到效率有显著提升,感兴趣的同学,自己也可以测试一下效果。

python实现:

import random

# python中直接实现二分查找算法
# python规范不喜欢驼峰命名,那就用下划线咯
def binary_search(list, target):
  low = 0 # 最小的下标
  high = len(list) - 1 # 最大的下标
  while low <= high: # 判断条件,缩小至只包含一个元素
    # // 地板除号,只取整数部分,就是向下取整
    mid = (low + high) // 2 # // 中间下标
    guess = list[mid]
    if guess == target:
      return mid
    if guess > target:
      high = mid - 1 # 猜的数字大了,调小high
    else 
      low = mid + 1 # 猜的数字小了,调大low

list = range(0,100)
a = random.randint(0,99)
print(binary_search(list, a))
复制代码

大O表示法


大O表示法让你能够比较操作数,它指出了算法运行时间的增速。

简单查询,需要检查每个元素,因此需要执行n次操作,最多猜测的次数与列表长度相同,这被称为线性时间,使用大O表示法,这个运行时间就是O(n)。

而二分查找需要执行 log n 次,大O表示法为O(log n)。


http://www.niftyadmin.cn/n/4441540.html

相关文章

Linux 安全设置手册

1、Bios Security 一定要给Bios设置密码&#xff0c;以防通过在Bios中改变启动顺序&#xff0c;而可以从软盘启动。这样可以阻止别人试图用特殊的启动盘启动你的系统&#xff0c;还可以阻止别人进入Bios改动其中的设置&#xff08;比如允许通过软盘启动等&#xff09;。 2、LI…

另辟蹊径--极简Swifty路由

另辟蹊径--极简Swifty路由 1. 前言 在组件化通信方案的设计之初&#xff0c;尽管我们是纯Swift的组件化&#xff0c;我也一直难逃窠臼的想用注册&#xff08;无论是注册协议还是注册URL&#xff09;的方式来解决问题&#xff0c;或者采用CTMediator的Target-Action方式&#xf…

Wine 0.9.20 发布

Wine 是在 Linux 操作系统下执行部分 Windows 应用程序的工具!如果你想在 Linux 下运行 Windows 程序,Wine 将是你必不可少的工具!Wine Is Not Emulator在 X 和 UNIX 之上的,Windows 3.x 和 Windows APIs 的实现.它是一个Windows 兼容层,这个层即提供了一个用来从 Windows 源进…

emotion使用笔记

emotion 9 升级到 10 了&#xff0c;所以9的用法就不总结了&#xff0c;官网上介绍的很详细。 点击传送门查看9升到10都变了哪些。 几点建议&#xff1a; &#xff08;1&#xff09;10中尽量只用import styled from emotion/styled/macro 原因是调试方便&#xff0c;可以方便地…

安装weblogic 11g

参考 https://blog.csdn.net/z69183787/article/details/38401013 https://blog.csdn.net/wjf8882300/article/details/52303728 http://blog.chinaunix.net/uid-29226528-id-4716909.html https://www.linuxidc.com/Linux/2013-09/89834.htm https://blog.csdn.net/chs007chs/…

sqldps病毒的手动删除办法

该病毒会首先探测对方机器的SQL服务端口&#xff0c;并会探测其他机器的其他服务端口&#xff0c;占用网络资源网络该病毒的主要症状有&#xff1a;1、网络可以ping的通&#xff0c;但是不能正常上网&#xff0c;打开网页有时会打不开。2、打印机不能共享&#xff0c;本机可以打…

note_vue-cli搭建项目

vue init webpack projectName# install dependencies npm install //安装依赖# serve with hot reload at localhost:8080 npm run dev //开发模式# build for production with minification npm run build //打包模式转载于:https://www.cnblogs.com/lsy-19…

Redis 高频面试题 2023 最新版

Redis 高频面试题 2023 最新版 文章目录 Redis 高频面试题 2023 最新版一、Redis缓存相关1. 什么是缓存穿透&#xff1f;如何解决2. 什么是缓存击穿&#xff1f;如何解决3. 什么是缓存雪崩&#xff1f;如何解决 一、Redis缓存相关 1. 什么是缓存穿透&#xff1f;如何解决 是什…