查找算法其实不简单
时间:2022-07-28
本文章向大家介绍查找算法其实不简单,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
查找算法
在LeetCode刷题或者面试过程中发现,查找问题一直是不可避免的。对任何数据结构的遍历过程无非就是查找过程。
我们需要针对某些数据结构的特点如何正确地、高效地进行查找,而查找的过程最需要注意边界控制。
下面以二分查找为例。
1. 二分查找
目的:在一个含有N个元素的有序数组中有效地的定位目标值。
思想:假设在有序数组arr中查找元素k,返回k所在的下标(索引值)。设arr[low,high]
是当前的查找区间,确定该区间的中间位置
,然后将待查的k值与arr[mid]比较:
- 若
k==arr[mid]
,说明找到k,则查找成功并且终止。 - 若
k<arr[mid]
,根据数组有序的前提,目标值k在左边的区域中,索引的范围改为[low, mid-1] - 若
k>arr[mid]
,目标值在右边的区域中,查找索引范围改为[mid+1, high]。
时间复杂度:
代码实现
# -*- coding: utf-8 -*-
# @Time : 2020-04-11 23:28
# @Author : yuzhou_1su
# @ContactMe : https://blog.csdn.net/yuzhou_1shu
# @File : Binary_Search.py
# @Software : PyCharm
def binary_search1(arr, item):
"""
二分查找的非递归实现1
:param arr: 有序数组
:param item: 待查元素
:return: 找到待查元素的所有;如果找不到,则返回None
"""
low = 0
high = len(arr) - 1 # 注意此处,high索引能取到
while low <= high: # 条件是low<=high,区间中没有元素时结束
mid = (low + high) // 2
curr_item = arr[mid]
if curr_item == item:
return mid
elif item < curr_item:
high = mid - 1 # high = mid - 1
else:
low = mid + 1
return None
def binary_search2(arr, item):
"""
左边界为n的二分查找
:param arr: 给定一个有序数组
:param item: 待查找的元素
:return: 找到待查元素的所有;如果找不到,则返回None
"""
low = 0
high = len(arr) # 此处 high的索引不能取到
while low < high: # 条件是low<high,区间中有一个元素时也结束
mid = (low + high) // 2
if arr[mid] == item:
return mid
elif item < arr[mid]:
high = mid # high = mid
else:
low = mid + 1
return None
def binary_search3_by_recursion(arr, item, low, high):
"""
二分查找的递归实现
:param arr: 给定一个有序数组
:param item: 待查找的元素
:param low: 左边界
:param high: 右边界
:return: 找到待查元素的所有;如果找不到,则返回None
"""
# 递归终止条件
if low > high:
return None
mid = low + (high - low) // 2
if arr[mid] == item:
return mid
elif arr[mid] > item:
return binary_search3_by_recursion(arr, item, low, mid-1)
else:
return binary_search3_by_recursion(arr, item, mid+1, high)
二分查找边界问题探讨:二分查找有几种写法?
2. 顺序查找
如果数组无序的话,只能通过循环遍历进行查找。
时间复杂度:
# -*- coding: utf-8 -*-
# @Time : 2020-09-09 18:06
# @Author : yuzhou_1su
# @ContactMe : https://blog.csdn.net/yuzhou_1shu
# @File : linear_search.py
# @Software : PyCharm
def linear_search(sequence, target):
"""线性查找
:param sequence: 待查找序列,可以无序
:param target: 待查元素
:return: 找到待查元素的所有;如果找不到,则返回None
"""
for i, v in enumerate(sequence):
if v == target:
return i
return None
3. 索引查找
增加一个索引表,索引表的每一项称为索引项,索引项的一般形式: (Key, Value)
。
索引查找的过程是:先在索引表中快速查找(索引表中可以按关键字有序排序,例如采用二分查找),找到关键字,然后通过对应的地址找到主数据表中的元素。
分块查找是一种典型的索引查找,其性能介于顺序查找和二分查找之间。
- python学习手册-环境安装和配置
- 全球最大家谱网站Ancestry.com意外泄露了30万名用户的登录凭证
- 摸金Redis漏洞
- 机器人越来越像人,你会担心你的工作被人工智能取代吗?
- 一句代码实现批量数据绑定[上篇]
- 机器学习-从高频号码中预测出快递送餐与广告骚扰
- MS Windows 下基于Atom的LaTeX编译环境的配置
- WCF中的Binding模型之一: Binding模型简介
- WCF中的Binding模型之一: Binding模型简介
- 2017最火的五篇深度学习论文 总有一篇适合你
- SplashScreenSource的妙用
- SplashScreenSource的妙用
- SplashScreenSource的妙用
- Nodejs学习笔记(十七)--- 浮点运算decimal.js
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 最详细的docker中安装并配置redis
- 剑指Offer LeetCode 面试题59 - I. 滑动窗口的最大
- 剑指Offer LeetCode 面试题58 - II. 左旋转字符串
- 剑指Offer LeetCode 面试题58 - I. 翻转单词顺序
- 剑指Offer LeetCode 面试题56 - II. 数组中数字出现的次数 II
- 站在软件工程的角度重新思考面向对象(含高清图谱)
- 剑指Offer LeetCode 面试题57. 和为s的两个数字
- 白嫖Layui树型可折叠,可自定义,可搜索表格的实例
- 剑指Offer LeetCode 面试题53 - II. 0~n-1中缺失的数字
- 聊聊dubbo-go的DubboPackage
- 剑指Offer LeetCode 面试题53 - I. 在排序数组中查找数字 I
- Java虚拟机运行时数据区精华总结
- 剑指Offer LeetCode 面试题50. 第一个只出现一次的字符
- 剑指Offer LeetCode 面试题40. 最小的k个数
- 剑指Offer LeetCode 面试题39. 数组中出现次数超过一半的数字