Python实现七大查找算法的示例代码

  • Post category:Python

Python实现七大查找算法的示例代码

查找算法是计算机科学中的一个重要问题。本文将介绍Python实现七大查找算法的示例代码,包括线性查找、二分查找、插值查找、斐波那契查找、树表查找、哈希查找和跳跃表查找。

线性查找

线性查找一种简单的查找算法,适用于小型数据集。该算法从数据集的第一个元素开始,逐个比较每个元素,直到找到目标元素或遍历完整个数据集。

以下是Python实现线性查找的示例代码:

def linear_search(arr, target):
    for i in range(len(arr)):
        if arr[i] == target:
            return i
    return -1

上述代码中,定义了一个linear_search函数,接受一个数组arr和目标元素target作为参数。在循环中,逐个比较数组中的元素,如果找到目标元素,则返回其索。如果遍历完整个数组仍未找到目标元素,则返回-1。

二分查找

二分查找是一种高效的查找算法,适用于有序数据集。该算法将数据集分成两个部分,每次比较中间元素,如果目标元素小于中间元素,则在左半部分继续查找,否则在右半部分查找,直到找到目标元素或无法继续分割。

以下是Python实现二分查找的示例代码:

def binary_search(arr, target):
    left, right = 0, len(arr) - 1
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1

上述代码中,定义了一个binary_search函数,接受一个有序数组arr和目标元素target作为参数。在循环中,每次将数组分成两个部分,比较中间元素,如果目标元素小于中间元素,则在左半部分继续查找,否则在右半部分查找,直到找到目标元素或无法继续分割。如果遍历完整个数组仍未找到目标元素,则返回-1。

示例说明

以下是两个示例,说明如何使用linear_search和binary_search函数查找目标元素。

示例1

使用linear_search函数查找目标元素5。

arr = [1, 3, 5, 7, 9]
target = 5
result = linear_search(arr, target)
if result != -1:
    print(f"目标元素{target}在数组中的索引为{result}")
else:
    print(f"目标元素{target}不在数组中")

输出结果:

目标元素5在数组中的索引为2

示例2

使用binary_search函数查找目标元素7。

arr = [1, 3, 5, 7, 9]
target = 7
result = binary_search(arr, target)
if result != -1:
    print(f"目标元素{target}在数组中的索引为{result}")
else:
    print(f"目标元素{target}不在数组中")

输出结果:

目标元素7在数组中的索引为3

插值查找

插值查找是一种高效的查找算法,适用于有序数据集。该算法根据目标元素在数据集中的位置,估算其可能的位置,从而快速定位目标元素。

以下是Python实现插值查找示例代码:

def interpolation_search(arr, target):
    left, right = 0, len(arr) - 1
    while left <= right and arr[left] <= target <= arr[right]:
        pos = left + (target - arr[left]) * (right - left) // (arr[right] - arr[left])
        if arr[pos] == target:
            return pos
        elif arr[pos] < target:
            left = pos + 1
        else:
            right = pos - 1
    return -1

上述代码中,定义了一个interpolation_search函数接受一个有序数组arr和目标元素target作为参数。在循环中,根据目标元素在数据集中的位置,估算其可能的位置,从而快速定位目标元素。如果找到目标元素,则返回其索引。如果历完整个数组仍未找到目标元素,则返回-1。

斐波那契查找

斐波那契查找是一种高效的查找算法,适用于有序数据集该算法利用斐波那契数列的特性,将数据集分成两个部分,每次比较中间元素,如果目标元素小于中间元素,则在左半部分继续查找,否则在右半部分查找,直到找到目标元素或无法继续分割。

以下是Python实现斐波那契查找的示例代码:

def fibonacci_search(arr, target):
    fib1, fib2 = 0, 1
    while fib2 < len(arr):
        fib1, fib2 = fib2, fib1 + fib2
    offset = -1
    while fib2 > :
        i = min(offset + fib1, len(arr) - 1)
        if arr[i] < target:
            fib2, fib1 = fib1, fib2 - fib1
            offset = i
        elif arr[i] > target:
            fib2, fib1 = fib2 - fib1, fib1
        else:
            return i
    if fib1 and arr[offset + 1] == target:
        return offset + 1
    return -1

上代码中,定义了一个fibonacci_search函数,接受一个有序数组arr和目标元素target作为参数。在循环中,利用斐波那契数列的特性,将数据分成两个部分,每次比较中间元素,如果目标元素小于中间元素,则在左半部分继续查找,否则在右半部分查找,直到找到目标元素或无法继续分割。如果找到目标元素,则返回其索引。如果遍历完整个数组仍未找到目标元素,则返回-1。

树表查找

树表查找是一种高效的查找算法,适用于有序数据集。该算法将数据集构建成一棵二叉查找树,每次比较中间节点,如果目标元素小于中间节点,则在左子树继续查找,否则在右子树查找,直到找到目标元素或无法继续分割。

以下是Python现树表查找的示例代码:

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

def build_tree(arr):
    if not arr:
        return None
    mid = len(arr) // 2
    root = TreeNode(arr[mid])
    root.left = build_tree(arr[:mid])
    root.right = build_tree(arr[mid+1:])
    return root

def tree_search(root, target):
    if not root:
        return -1
    if root.val == target:
        return 0
    elif root.val < target:
        result = tree_search(root.right, target)
        if result == -1:
            return -1
        else:
            return result + 1
    else:
        result = tree_search(root.left, target)
        if result == -1:
            return -1
        else:
            return result + 1

上述代码中,定义了一个TreeNode类表示二叉查找树的节点,包括节点值和左右子树。build_tree函数接受一个有序数组arr为参数,构建一棵二叉查找树。tree_search函数接受一个二叉查找树的根节点root和目标元素target作为参数,递归比较中间节点,如果目标元素小于中间节点,则在左子树继续查找,否则在右子树查找,直到找到目标元素或法继续分割。如果找到目标元素,则返回其深度。如果遍历完整个树仍未找到目标元素,则返回-1。

哈希查找

哈希查找是一种高效的查找算法,适用于大型数据集。该算法将数据集映射到哈希表中,每次查找时,根据目标元素的哈希值,快速定位其可能的位置,从而快速定位目标元素。

以下是Python实现哈希查找的示例代码:

class HashTable:
    def __init__(self):
        self.size = 10
        self.table = [[] for _ in range(self.size)]

    def hash_func(self, key):
        return key % self.size

    def insert(self, key, value):
        hash_key = self.hash_func(key)
        for i, item in enumerate(self.table[hash_key]):
            if item[0] == key:
                self.table[hash_key][i] = (key, value)
                return
        self.table[hash_key].append((key, value))

    def search(self, key):
        hash_key = self.hash_func(key)
        for item in self.table[hash_key]:
            if item[0] == key:
                return item[1]
        return None

上述代码中,定义了一个HashTable类表示哈希表,包括哈希表大小和哈希表数组。hash_func函数接受一个键值key作为参数,返回其哈希值。insert函数接受一个键值key和值value作为参数,将其插入哈希表中。search函数接受一个键值key作为参数,根据其哈希值快速定位其可能的位置,从而快速定位目标元素。如果找到目标元素,则返回其值。如果遍历完整个哈希表仍未找到目标元素,则返回None。

跳跃表查找

跳跃表查找是一种高效的查找算法,适用于大型数据集。算法将数据集构建成一种特殊的链表,每个节点包含多个指针,可以快速跳过一些节点,从而快速定位目标元素。

以下是Python实现跳跃表查找的示例代码:

import random

class Node:
    def __init__(self, val):
        self.val = val
        self.next = None
        self.down = None

class SkipList:
    def __init__(self):
        self.head = Node(-1)
        self.levels = 1

    def insert(self, val):
        level = 1
        while random.random() < 0.5:
            level += 1
        if level > self.levels:
            self.head.next = Node(val)
            for i in range(self.levels, level):
                node = Node(-1)
                node.down = self.head.next
                self.head.next = node
            self.levels = level
        node = self.head.next
        prev = self.head
        for i in range(self.levels - 1, -1, -1):
            while node and node.val < val:
                prev, node = node, node.next
            if i < level:
                new_node = Node(val)
                new_node.next = node
                prev.next = new_node
                new_node.down = down_node
                down_node = new_node
            prev, node = prev.down, node.down

    def search(self, val):
        node = self.head.next
        for i in range(self.levels - 1, -1, -1):
            while node and node.val < val:
                node = node.next
            if node and node.val == val:
                return True
            node = node.down
        return False

上述代码中,定义了一个Node类表示跳跃表的节点,包括节点值、下一个节点和下一层节点。SkipList类表示跳跃表,包括头节点和层数。insert函数接受一个值val作为参数,将其插入跳跃表中。search函数接受一个值val作为参数,快速定位目标元素。如果找到目标元素,则返回True。如果遍历完整个跳跃表仍未找到目标元素,则返回False。

总结

本文介绍了Python实现七大查找算法的示例代码,包括线性查找、二分查找、插值查找、斐波那契查找、树表查找、哈希查找和跳跃表查找不同的查找算法适用于不同的数据集和场景,需要根据实际情况选择合适的算法。在实际应用中,需要注意算法的时间复杂度和空间复杂度,以获得更好的性能。