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

news2024/9/19 22:10:43

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

  • 1、引言
  • 2、平面图直径问题的亚线性算法
    • 2.1 定义
    • 2.2 核心原理
      • 2.2.1 跳表
      • 2.2.2 跳跃搜索
      • 2.2.3 分块搜索
    • 2.3 应用场景
    • 2.4 算法公式
    • 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) k2
  • 顶层:仅包含几个或一个节点。

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

2.5 代码示例

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2072678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计选题推荐-保险业务管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

[CUDA编程] --- cuda线程模型

1 核函数 先看一个cuda版本的hello world #include <stdio.h>__global__ void helloworld() {printf("hello world\n"); }int main() {helloworld()<<<1, 1>>>();cudaDeviceSynchronize();return 0; }这里helloworld()<<<1, 1>…

旅行达人必备!有道翻译和这三款神器,轻松走遍世界

在如今的全球化和科技迅猛发展的时代&#xff0c;翻译工具在我们的日常生活中发挥着越来越重要的作用。在各种格式数据的翻译当中&#xff0c;我们就可以发现各种类型的翻译工具纷纷崭露头角。今天就分享三款除了有道翻译外的好用翻译工具&#xff0c;希望可以解决大家翻译的需…

虚幻5|暴击攻击和释放技能,造成伤害

玩家数据的Actor组件制作&#xff1a;虚幻5|制作玩家血量&#xff0c;体力-CSDN博客 造成伤害时&#xff0c;显示暴击及暴击字体颜色和未暴击的字体颜色&#xff0c;还有释放技能连击 一.编辑暴击数据 1.打开之前创建的玩家数据Actor组件 创建一个浮点变量&#xff0c;命名…

从法律风险的角度来看,项目经理遇到不清楚或不明确问题时的处理

大家好&#xff0c;我是不会魔法的兔子&#xff0c;在北京从事律师工作&#xff0c;日常分享项目管理风险预防方面的内容。 序言 在项目开展过程中&#xff0c;有时候会遇到一些不清楚或不明确的状况&#xff0c;但碍于项目进度的紧迫性&#xff0c;不得不硬着头皮做决策&…

喜羊羊教你(如何应对突发的技术故障和危机?)

开发团队如何应对突发的技术故障和危机&#xff1f; 在数字化时代&#xff0c;软件服务的稳定性至关重要。、8月19日下午&#xff0c;网易云音乐疑似出现服务器故障&#xff0c;网页端出现502 Bad Gateway 报错&#xff0c;且App也无法正常使用。 怀疑了自己的电脑、自己的手…

OpenStack 常见模块(二)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

MFC工控项目实例之七点击下拉菜单弹出对话框

承接专栏《MFC工控项目实例之六CFile添加菜单栏》 1、在SEAL_PRESSUREDlg.h文件中添加代码 class CSEAL_PRESSUREDlg : public CDialog { ...afx_msg void OnTypeManage(); ... } 2、在SEAL_PRESSUREDlg.cpp文件中添加代码 BEGIN_MESSAGE_MAP(CSEAL_PRESSUREDlg, CDialog)//…

如何使用ssm实现基于Java的学生信息管理系统的设计与实现

TOC ssm165基于Java的学生信息管理系统的设计与实现jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&a…

python-随机序列(赛氪OJ)

[题目描述] 小理的作业太多了&#xff0c;怎么也做不完。 小理的数学作业由 T 张试卷组成&#xff0c;每张试卷上有 n 个数 a1..n​ &#xff0c;小理需要算出这些数的极差和方差。极差是一个整数&#xff0c;方差是一个浮点数&#xff0c;要求保留到小数点后 3 位。虽然题目很…

iPhone 手机使用技巧:iPhone 数据恢复软件

无论是由于意外删除、系统崩溃还是软件更新&#xff0c;丢失 iPhone 上的数据都是一场噩梦。从珍贵的照片到重要的工作文件&#xff0c;这种损失可能会让人感到毁灭性。值得庆幸的是&#xff0c;几个 iPhone 数据恢复软件选项可以帮助您找回丢失的文件。这些工具提供不同的功能…

大学数据库系统原理 Mysql数据库实验记录

软件版本说明&#xff1a; 1.Mysql数据库&#xff1a;sql server8.0 2.命令实现使用以及数据库可视化查看&#xff1a;Navicat 16 #不用Mysql Command Line 的原因是不喜欢那个黑框&#xff0c;也不常用&#xff0c;使用Navicat的MYSQL命令列界面是一样的 另外说明 实现相同…

Junit单元测试笔记

常用mock类框架 在软件测试和开发过程中&#xff0c;Mock框架扮演着至关重要的角色&#xff0c;它们允许开发者模拟对象的行为&#xff0c;以便在不需要实际依赖的情况下进行测试。以下是一些常用的Mock框架&#xff1a; MockitoPowerMockEasyMockJMockSpock 初始化mock/spy…

解决ONENOTE复制文字到外部为图片(Ditto)

默认情况下&#xff0c;在ONENOTE中记录的文字&#xff0c;在复制粘贴到外部时&#xff0c;会成为一张图片格式 如下图这段文字&#xff0c;粘贴到QQ中变为了图片 解决办法&#xff1a;安装Ditto Ditto下载链接 点击Download下载 双击安装.exe&#xff0c;选择安装路径后&…

JVM上篇:内存与垃圾回收篇-07-方法区

笔记来源&#xff1a;尚硅谷 JVM 全套教程&#xff0c;百万播放&#xff0c;全网巅峰&#xff08;宋红康详解 java 虚拟机&#xff09; 文章目录 7. 方法区7.1. 栈、堆、方法区的交互关系7.2. 方法区的理解7.2.1. 方法区在哪里&#xff1f;7.2.2. 方法区的基本理解7.2.3. HotSp…

编译 wolfssl 库

wolfssl github: https://github.com/wolfSSL/wolfssl 编译 .lib 或者 .dll wolfssl 很好的提供了 win32 的工程》sln 文件 这样就不用折腾 CMakeLists 文件了&#xff0c;使用 Visual Studio 打开 sln 文件后&#xff0c;设置好 Static 编译库即可&#xff0c;开箱即用 编译 .…

项目开始后,拒绝客户提出的新需求是否会违约?

大家好&#xff0c;我是不会魔法的兔子&#xff0c;在北京从事律师工作&#xff0c;日常分享项目管理风险预防方面的内容。 序言 当一个项目已经开展后&#xff0c;对于项目组而言&#xff0c;最难以忍受的可能要数需求突然发生变化了&#xff0c;尤其是在项目已经进行一半或…

【Netty】Netty时间轮实践与源码解析

目录 定时任务JDK定时任务Timer原理 ScheduledThreadPoolExecutor 时间轮算法netty时间轮架构 netty时间轮 源码解析基本使用HashedWheelTimer 初始化createWheel 创建HashedWheelBucket数组 newTimeout 添加任务执行任务时间轮的优缺点 品一品优秀设计实际的生产环境选择 定时…

css中块,行内块,行内元素转换

参考 元素作用范围 块元素 会在显示时自动换行&#xff0c;例如p标签div等 行内元素 例如span&#xff0c;可以认为是一个不换行的块&#xff0c;其他还有label等 行内块元素 例如img标签显示图片&#xff0c;但不换行 区别 块元素可以设置宽高&#xff0c;但行元素不…

C/C++语言基础--结构体知识详解(包括:结构体数组、字节对齐、位段等内容)

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 C语言地结构体是核心内容之一&#xff0c;他运行自定义数据类型&#xff0c;可以将不同地数据类型当作成一个整体&#xff0c;变成一个数据类型&#xff0c;运用及其广泛欢迎点赞 收藏 关注&#xff0c;本…