【大数据算法】一文掌握大数据算法之:排序链表搜索的亚线性算法。

排序链表搜索的亚线性算法

  • 1、引言
  • 2、平面图直径问题的亚线性算法
    • [2.1 定义](#2.1 定义)
    • [2.2 核心原理](#2.2 核心原理)
      • [2.2.1 跳表](#2.2.1 跳表)
      • [2.2.2 跳跃搜索](#2.2.2 跳跃搜索)
      • [2.2.3 分块搜索](#2.2.3 分块搜索)
    • [2.3 应用场景](#2.3 应用场景)
    • [2.4 算法公式](#2.4 算法公式)
    • [2.5 代码示例](#2.5 代码示例)
  • 3、总结

1、引言

小屌丝 :鱼哥,这茶味道怎么样?
小鱼 :嗯,确实不错?
小屌丝 :这时间也差不多了, 我们去泡泡澡?
小鱼 :也行,这茶叶,带着。
小屌丝 :... 鱼哥,咱这会所有茶啊。
小鱼 :别这么小气,你这茶味道不错的。
小屌丝 :你这...没喝到这个茶叶之前, 你喝其他的,这味道不也是不错的嘛。
小鱼 :要不,咱再等一会?
小屌丝 :怎么不着急了?
小鱼 :我突然想起来,排序链表搜索的亚线性算法还没跟你说的
小屌丝 :这个,我不着急啊。
小鱼 :那不行, 学习岂能学一半的时候,
小屌丝 :...。
小鱼 :这茶,再冲泡一次。
小屌丝 :...
小鱼 :别那么小气。
小屌丝:... 好好好~

2、平面图直径问题的亚线性算法

2.1 定义

在数据结构中,排序链表是一种链表,其中节点按某种自然顺序排序。

对排序链表进行搜索时,传统线性搜索的时间复杂度是 O ( n ) O(n) O(n),其中 n n n是链表的长度。

亚线性时间算法旨在通过某些特殊技巧和预处理步骤,使搜索操作的时间复杂度低于 O ( n ) O(n) O(n),实现更快的查询速度。

2.2 核心原理

排序链表搜索的亚线性算法主要利用了如下核心原理:

  • 跳表(Skip List):一种层级化的链表结构,增加了多层索引以实现更快的跳跃和搜索。
  • 跳跃搜索(Jump Search):在链表上进行固定长度的跳跃,以减少搜索范围。
  • 分块搜索(Block Search):将链表划分为若干块,每块进行局部排序,再在每块内进行二分查找。

2.2.1 跳表

跳表(Skip List)

  • 跳表是一种层次化的数据结构,允许快速搜索。跳表为普通链表增加了多层"跳跃"链表,每层链表的长度是下层的约一半,通过这些级联的跳跃层,可以快速跳过大量元素。

2.2.2 跳跃搜索

跳跃搜索(Jump Search)

  • 跳跃搜索算法在排序链表上以固定步长跳跃进行搜索,先找到目标值可能存在的区间,再在该区间内进行线性扫描,从而减少搜索的耗时。
  • 假设步长为 k k k,则其时间复杂度为 O ( √ n ) O(√n) O(√n)。

2.2.3 分块搜索

分块搜索(Block Search)

  • 分块搜索将排序链表划分成若干块,每块内进行局部排序,然后在每块内进行二分查找。
  • 这种方法利用了局部性的优势,实现了更快的搜索速度。

2.3 应用场景

平排序链表搜索的亚线性算法在以下场景中具有广泛的应用:

  • 数据库索引:跳表广泛应用于数据库索引结构,如 LevelDB 和 Redis。
  • 搜索引擎:在各种搜索引擎中,跳表用于快速查找和排序。
  • 网络路由:在计算网络路由路径时,跳表有助于快速定位路由信息。
  • 内存缓存:在高速缓存系统中,跳表用于快速存取缓存数据。

2.4 算法公式

以跳表为例,其时间复杂度通常为 O ( l o g n ) O(log n) O(logn),这显著优于传统链表的 O ( n ) O(n) O(n)。

跳表算法的索引结构

设节点总数为 n,则跳表的结构通常包括以下几层:

  • 底层:包含所有节点。
  • 上层:每隔 k k k 个节点抽取一个节点 ( k ≈ 2 ) (k ≈ 2) (k≈2)。
  • ...
  • 顶层:仅包含几个或一个节点。

各层的节点数大致为 n n n, n / 2 n/2 n/2, n / 4 n/4 n/4, ..., 1。

2.5 代码示例

python 复制代码
# -*- coding:utf-8 -*-
# @Time   : 2024-08-10
# @Author : Carl_DJ

import random

class SkipListNode:
    def __init__(self, value, level):
        self.value = value
        self.forward = [None] * (level + 1)

class SkipList:
    def __init__(self, max_level):
        self.max_level = max_level
        self.header = SkipListNode(None, max_level)
        self.level = 0

    def random_level(self):
        level = 0
        while random.random() < 0.5 and level < self.max_level:
            level += 1
        return level

    def insert(self, value):
        update = [None] * (self.max_level + 1)
        current = self.header

        for i in range(self.level, -1, -1):
            while current.forward[i] and current.forward[i].value < value:
                current = current.forward[i]
            update[i] = current

        level = self.random_level()
        if level > self.level:
            for i in range(self.level + 1, level + 1):
                update[i] = self.header
            self.level = level

        new_node = SkipListNode(value, level)
        for i in range(level + 1):
            new_node.forward[i] = update[i].forward[i]
            update[i].forward[i] = new_node

    def search(self, value):
        current = self.header
        for i in range(self.level, -1, -1):
            while current.forward[i] and current.forward[i].value < value:
                current = current.forward[i]
        current = current.forward[0]

        return current and current.value == value

# 示例使用
skiplist = SkipList(max_level=4)
values = [1, 3, 7, 8, 9, 10, 13, 14, 19]
for value in values:
    skiplist.insert(value)

# 搜索
search_value = 10
found = skiplist.search(search_value)
print(f"Value {search_value} {'found' if found else 'not found'} in the skiplist")

代码解析

  • SkipListNode 类定义了跳表节点,每个节点包含一个值和一个 forward 数组,表示该节点的跳跃层。
  • SkipList 类定义了跳表的数据结构和基本操作,包括插入和搜索。
  • random_level 方法定义了一个基于随机数的层级选择机制,符合跳表的性质。
  • insert 方法插入一个新值到跳表中,动态调整跳表的层级。
  • search 方法在跳表中搜索一个值,利用多层索引快速定位。

3、总结

排序链表搜索的亚线性算法通过多层索引、固定步长跳跃、以及分块搜索等技术,显著降低了搜索时间复杂度。

跳表作为一种高效的数据结构,已经证明其在数据库索引、搜索引擎、内存缓存等领域的有效性和广泛应用。

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 企业认证金牌面试官
  • 多个名企认证&特邀讲师等
  • 名企签约职场面试培训、职场规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)评测一等奖获得者

关注小鱼 ,学习【大数据算法】领域最新最全的领域知识。

相关推荐
陈小唬24 分钟前
树形结构构建的两种方式
java·数据库·算法
_Power_Y1 小时前
浙大数据结构:02-线性结构3 Reversing Linked List
数据结构
7yewh1 小时前
STM32常用数据采集滤波算法
stm32·嵌入式硬件·算法
不会编程的小江江2 小时前
【动态规划】(一)动态规划理论及基础题目
c++·算法·动态规划
qq_535246142 小时前
代码随想录 第九章 动态规划part03 01背包问题 一维 416. 分割等和子集
算法·动态规划·代理模式
萌新小码农‍2 小时前
matlab基本语法
网络·数据结构·matlab
巧手打字通2 小时前
数据结构之美-深入理解树形结构
数据结构·树形结构
超维机器人2 小时前
智能巡检机器人局部放电检测的应用
运维·人工智能·算法·机器人
Crossoads2 小时前
【数据结构】带你初步了解排序算法
c语言·开发语言·数据结构·算法·排序算法
lovPopcorn2 小时前
力扣每日一题:1372.二叉树中的最长交错路径
java·算法·leetcode