SkyflyBird

注:

算法演示工具: https://algorithm-visualizer.org/

参考:https://www.runoob.com/python3/python3-examples.html

参考:《算法图解》

环境: Visual Code Python2.7

 

线性查找

简介:按照一定的顺序检查数组中的每一个元素,直到寻找到指定的值结束。

时间: O(n)

图示:

示例:

# -*- coding:UTF-8 -*-
#!/usr/bin/env python

import sys

# 查找指定值
def line_search(arr, value):
    for i in range(1,len(arr)):
        print(u\'-->查找数组中数值:{0}\'.format(arr[i]))
        if arr[i] == value:
            return i 
    
    return -1

if __name__ == \'__main__\':
    arr = [-5,10,8,6,0,5]
    searchValue = 5
    print(u\'查找数组:{0}, 查找数值:{1}\'.format(arr, searchValue))
    index = line_search(arr,searchValue)
    if index != -1:
        print(u\'元素在数组中的索引为{0}\'.format(index))
    else:
        print(u\'未找到!!!\')
\'\'\' 查找数组:[-5, 10, 8, 6, 0, 5], 查找数值:5 -->查找数组中数值:10 -->查找数组中数值:8 -->查找数组中数值:6 -->查找数组中数值:0 -->查找数组中数值:5 元素在数组中的索引为5 \'\'\'

二分查找

简介:又称折半查找,适用于在有序数组中查找特定元素。搜索过程从数组的中间开始查找,如果特定元素小于或大于中间元素,则在数组大于或小于中间元素的那一半查找。

时间:O(logN)

图示:

示例:

# -*- coding:UTF-8 -*-
#!/usr/bin/env python

# UnicodeEncodeError: \'ascii\' codec can\'t encode characters in position 0-1: ordinal not in range
import sys
reload(sys)
sys.setdefaultencoding(\'utf8\')

def binary_search(_list, searchNum):
    low = 0                             # 最小数下标
    high = len(_list) - 1               # 最大数下标

    # low <= high时才能证明中间有数
    index = 1
    while low <= high:
        mid = (low+high)/2              # 中间数下标 
        print(u\'查找的次数为:{0}, low = {1}, high = {2} mid = {3}\'.format(index, low, high, mid))
        guess = _list[mid]
        if guess == searchNum:
            return mid
        elif guess > searchNum:         # 中间数大于指定数字,最大数下标移动  
            high = mid - 1
        else:
            low = mid + 1  

        index += 1             
    
    return None 

if __name__ == \'__main__\':
    maxCount = input(u\'请输入列表的最大数值:\'.encode(\'gbk\'))
    searchNum = input(u\'请输入要查找的数值:\'.encode(\'gbk\'))

    print(u\'搜寻顺序列表,数据为0 ~ {0}, 查找:{1}\'.format(maxCount, searchNum))
    index = binary_search(range(maxCount), searchNum)
    print(u\'查找出的索引为:\'+ str(index))


\'\'\'
请输入列表的最大数值:1000
请输入要查找的数值:569
搜寻顺序列表,数据为0 ~ 1000, 查找:569
查找的次数为:1, low = 0, high = 999 mid = 499
查找的次数为:2, low = 500, high = 999 mid = 749
查找的次数为:3, low = 500, high = 748 mid = 624
查找的次数为:4, low = 500, high = 623 mid = 561
查找的次数为:5, low = 562, high = 623 mid = 592
查找的次数为:6, low = 562, high = 591 mid = 576
查找的次数为:7, low = 562, high = 575 mid = 568
查找的次数为:8, low = 569, high = 575 mid = 572
查找的次数为:9, low = 569, high = 571 mid = 570
查找的次数为:10, low = 569, high = 569 mid = 569
查找出的索引为:569
\'\'\'

 

分类:

技术点:

相关文章:

  • 2022-02-25
  • 2022-12-23
  • 2022-12-23
  • 2022-01-27
  • 2021-11-06
  • 2022-12-23
  • 2022-12-23
  • 2021-09-09
猜你喜欢
  • 2022-12-23
  • 2021-12-20
  • 2021-12-10
  • 2022-02-05
  • 2021-04-19
  • 2021-12-10
相关资源
相似解决方案