哈希表(Hash Table)、跳表(Skip List) 和 有序字典(Ordered Dictionary) 的详细介绍

一、哈希表(Hash Table)

1. 定义

哈希表是一种以键值对(key-value)形式存储数据的结构,使用哈希函数将键映射到存储位置(索引)。通过哈希表,可以快速地根据键查找、插入和删除对应的值。

2. 特点
  • 快速操作:平均情况下,查找、插入和删除操作的时间复杂度为 O(1)。
  • 键唯一性:每个键在哈希表中都是唯一的,不能重复。
  • 动态扩展:当元素数量超过一定阈值时,哈希表会自动扩展以保持性能。
3. 优缺点
  • 优点
    • 高效性:快速的查找和插入操作。
    • 灵活性:支持多种数据类型作为键值。
  • 缺点
    • 碰撞处理:不同的键可能会被映射到相同的索引,需要处理碰撞。
    • 无序性:哈希表中的元素没有特定的顺序。
    • 内存消耗:可能会有额外的内存开销。
4. 应用场景
  • 缓存实现:用于实现高效的缓存机制。
  • 计数器:在需要频繁插入和查找的场景,如词频统计。
  • 索引:用于数据库索引和快速查找。
5. 示例代码(Java 实现哈希表)
import java.util.HashMap;

public class HashTableExample {
    public static void main(String[] args) {
        HashMap<String, Integer> hashTable = new HashMap<>();
        
        // 添加元素
        hashTable.put("Apple", 3);
        hashTable.put("Banana", 5);
        hashTable.put("Orange", 2);
        
        // 打印哈希表
        System.out.println("哈希表中的元素: " + hashTable);
        
        // 查找元素
        System.out.println("Apple 的数量: " + hashTable.get("Apple"));
        
        // 删除元素
        hashTable.remove("Banana");
        System.out.println("删除 Banana 后的元素: " + hashTable);
    }
}

二、跳表(Skip List)

1. 定义

跳表是一种随机化的数据结构,它通过建立多级索引来提高有序列表的查找效率。跳表可以看作是一个包含多个层次的链表,每一层都跳过一定数量的元素,从而在平均情况下实现 O(log⁡n) 的查找、插入和删除效率。

2. 特点
  • 分层结构:跳表由多个层级构成,底层包含所有元素,每一层通过指针连接,逐层跳过元素。
  • 随机性:元素的层级是随机生成的,这有助于保持平衡。
  • 有序性:元素在每一层中都是有序的。
3. 优缺点
  • 优点
    • 高效查找:查找、插入和删除操作的平均时间复杂度为 O(log⁡n)。
    • 简单实现:相较于自平衡树(如 AVL 树),实现更加简单。
  • 缺点
    • 内存消耗:需要额外的空间来存储多级索引。
    • 随机性影响:最坏情况下性能可能下降。
4. 应用场景
  • 有序集合:需要频繁查找和插入的有序集合,如数据库索引。
  • 动态数据:适合处理动态变化的数据集。
5. 示例代码(Java 实现跳表)
import java.util.Random;

class Node {
    int value;
    Node[] forward;

    Node(int level, int value) {
        this.value = value;
        this.forward = new Node[level + 1];
    }
}

public class SkipList {
    private static final int MAX_LEVEL = 16; // 最大层数
    private Node header; // 头节点
    private int level; // 当前最大层数
    private Random random;

    public SkipList() {
        header = new Node(MAX_LEVEL, Integer.MIN_VALUE);
        level = 0;
        random = new Random();
    }

    // 随机生成层数
    private int randomLevel() {
        int lvl = 0;
        while (lvl < MAX_LEVEL && random.nextInt(2) == 1) {
            lvl++;
        }
        return lvl;
    }

    // 插入元素
    public void insert(int value) {
        Node[] update = new Node[MAX_LEVEL + 1];
        Node current = header;

        for (int i = level; i >= 0; i--) {
            while (current.forward[i] != null && current.forward[i].value < value) {
                current = current.forward[i];
            }
            update[i] = current;
        }

        current = current.forward[0];

        if (current == null || current.value != value) {
            int newLevel = randomLevel();
            if (newLevel > level) {
                for (int i = level + 1; i <= newLevel; i++) {
                    update[i] = header;
                }
                level = newLevel;
            }
            Node newNode = new Node(newLevel, value);
            for (int i = 0; i <= newLevel; i++) {
                newNode.forward[i] = update[i].forward[i];
                update[i].forward[i] = newNode;
            }
        }
    }

    // 查找元素
    public boolean search(int value) {
        Node current = header;
        for (int i = level; i >= 0; i--) {
            while (current.forward[i] != null && current.forward[i].value < value) {
                current = current.forward[i];
            }
        }
        current = current.forward[0];
        return current != null && current.value == value;
    }
}

三、有序字典(Ordered Dictionary)

1. 定义

有序字典是一种存储键值对的数据结构,除了能够快速访问键值对外,还能保持插入的顺序。Java 中可以使用 LinkedHashMap 实现有序字典。

2. 特点
  • 顺序保持:元素按插入顺序存储,遍历时会按照插入顺序返回元素。
  • 键唯一性:每个键在字典中都是唯一的,不允许重复。
  • 高效性:查找、插入和删除操作的时间复杂度为 O(1)。
3. 优缺点
  • 优点
    • 顺序访问:适合需要保留元素插入顺序的场景。
    • 高效性:支持快速查找和修改操作。
  • 缺点
    • 内存消耗:相较于普通哈希表,由于需要维护插入顺序,内存消耗可能更大。
4. 应用场景
  • 缓存:需要根据插入顺序来管理元素的缓存。
  • 序列化:在需要保留数据顺序的情况下,适用于 JSON 等数据格式。
5. 示例代码(Java 实现有序字典)
import java.util.LinkedHashMap;

public class OrderedDictionaryExample {
    public static void main(String[] args) {
        LinkedHashMap<String, Integer> orderedDict = new LinkedHashMap<>();
        
        // 添加元素
        orderedDict.put("Apple", 3);
        orderedDict.put("Banana", 5);
        orderedDict.put("Orange", 2);
        
        // 打印有序字典
        System.out.println("有序字典中的元素: " + orderedDict);
        
        // 查找元素
        System.out.println("Apple 的数量: " + orderedDict.get("Apple"));
        
        // 删除元素
        orderedDict.remove("Banana");
        System.out.println("删除 Banana 后的元素: " + orderedDict);
    }
}

总结比较

数据结构特点操作复杂度应用场景
哈希表 (Hash Table)快速查找,存储无序的键值对插入、删除、查找:O(1)O(1)O(1)缓存、数据去重、频率统计
跳表 (Skip List)多层链表结构,支持快速查找插入、删除、查找:O(log⁡n)O(\log n)O(logn)数据库索引、内存存储
有序字典 (Ordered Dictionary)按照插入顺序存储键值对插入、删除:O(n)O(n)O(n),查找:O(1)O(1)O(1)配置管理、数据序列化

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

百度集度嵌入式面试题及参考答案

linux 系统之间通信机制有哪些&#xff1f; Linux 系统之间存在多种通信机制&#xff0c;以下是一些常见的通信机制及其详细介绍。 管道&#xff08;Pipe&#xff09; 原理&#xff1a;管道是一种半双工的通信方式&#xff0c;数据只能单向流动。它基于文件描述符&#xff0c;在…

使用vite+react+ts+Ant Design开发后台管理项目(五)

前言 本文将引导开发者从零基础开始&#xff0c;运用vite、react、react-router、react-redux、Ant Design、less、tailwindcss、axios等前沿技术栈&#xff0c;构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导&#xff0c;文章旨在为开发者揭示如何利用这些技术…

MATLAB计算朗格朗日函数

1. 朗格朗日函数介绍 朗格朗日函数&#xff08;Lagrange function&#xff09;通常用于优化问题&#xff0c;尤其是带有约束的优化问题。其一般形式为&#xff1a; 其中&#xff1a; f(x) 是目标函数。 是约束条件。 是拉格朗日乘子。 为了编写一个MATLAB代码来计算和绘制…

微信全新体验来袭,让你的微信再升级

在这个信息爆炸的时代&#xff0c;微信作为我们日常生活中不可或缺的社交工具&#xff0c;每一次的更新都牵动着亿万用户的心。 最近&#xff0c;微信再次发力&#xff0c;为安卓、iOS、鸿蒙以及PC端的用户带来了全新的功能体验。今天&#xff0c;就让我们一起走进这些新功能&…

ES + SkyWalking + Spring Boot:日志分析与服务监控(三)

目录 一、搭建SkyWalking 1.1 版本选择 1.2 下载安装 1.3 配置启动 1.4 SkyWalking UI介绍 二、Springboot项目使用 2.1 Agent下载 2.2 Agent配置skywalking oap地址 2.3 IDEA配置Agent地址 2.4 生成的ES索引介绍 三、在kibana上查看日志 四、问题和解决 3.1 日志…

算法笔记:Day-09(初始动态规划)

509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 …

Jenkins 构建时候提示超时错误被终止

近期在使用 Jenkins 构建项目的时候&#xff0c;经常性得到错误&#xff1a; - Building for production... Build timed out (after 3 minutes). Marking the build as aborted.当再次重构后&#xff0c;貌似没有问题&#xff0c;等候一段时间后问题又再次出现。 问题和解决…

angular实现list列表和翻页效果

说明&#xff1a;angular实现list列表和翻页效果 上一页 当前页面 下一页 效果图&#xff1a; step1: E:\projectgood\ajnine\untitled4\src\app\car\car.component.css .example-form-fields {display: flex;align-items: flex-start; }mat-list-item{background: antiquew…

基于SpringBoot+Gpt个人健康管家管理系统【提供源码+答辩PPT+参考文档+项目部署】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

Ubuntu开启FTP与SSH服务

在配置开发环境时&#xff0c;这两个配置感觉是最有用的&#xff0c;开启FTP服务可以将远程linux上的文件映射到Windows上&#xff0c;不管是使用虚拟机还是嵌入式linux设备&#xff0c;特别在开发写代码的时候&#xff0c;映射到Windows上使用VS code打开编写比在linux上编写舒…

GitHub上传自己的项目

目录 一、安装Git插件 1&#xff09;下载 2&#xff09;安装 二、创建Gothub的创库 三、通过Git上传本地文件到Github 四、其他 1、部分指令 2、如果已经运行过git init并设置了[user]&#xff0c;下次可以直接用 一、安装Git插件 1&#xff09;下载 下载地址&#x…

10款音视频转文字工具体验记!!!

如今互联网数据的便捷&#xff0c;记录不仅仅只有文字的形式&#xff0c;还有视频的形式&#xff01;但是有时候&#xff0c;我们只有视频&#xff0c;却需要文字文档&#xff0c;那要怎么办呢&#xff1f;今天我要和大家分享一下我使用过的那些语音转文字工具的体验感受。语音…

SpringBoot在线教育系统:集成第三方服务

5系统详细实现 5.1 普通管理员管理 管理员可以对普通管理员账号信息进行添加修改删除操作。具体界面的展示如图5.1所示。 图5.1 普通管理员管理界面 5.2 课程管理员管理 管理员可以对课程管理员进行添加修改删除操作。具体界面如图5.2所示。 图5.2 课程管理员管理界面 5.3 …

深度学习基础知识-损失函数

目录 1. 均方误差&#xff08;Mean Squared Error, MSE&#xff09; 2. 平均绝对误差&#xff08;Mean Absolute Error, MAE&#xff09; 3. Huber 损失 4. 交叉熵损失&#xff08;Cross-Entropy Loss&#xff09; 5. KL 散度&#xff08;Kullback-Leibler Divergence&…

Web Broker(Web服务应用程序)入门教程(1)

1、介绍 Web Broker 组件&#xff08;位于工具面板的“Internet”选项卡中&#xff09;可以帮助您创建与特定统一资源标识符&#xff08;URI&#xff09;相关联的事件处理程序。当处理完成后&#xff0c;您可以通过编程方式构建 HTML 或 XML 文档&#xff0c;并将它们传输给客…

基于springboot+vue实现的养老院管理系统(源码+L文+ppt)

基于springbootvue实现的养老院管理系统&#xff08;源码L文ppt&#xff09;4-106 养老院系统管理是一个综合性养老在线平台&#xff0c;旨在综合并简化养老机构中的照护流程。该系统集成了多种功能&#xff0c;以支持医生、护士、家属及管理员等不同角色的需求。对于医务人员而…

dify实战案例分享-基于多模态模型的发票识别

1 什么是dify Dify是一个开源的大语言模型&#xff08;LLM&#xff09;应用开发平台&#xff0c;旨在简化和加速生成式AI应用的创建和部署。它结合了后端即服务&#xff08;Backend as Service, BaaS&#xff09;和LLMOps的理念&#xff0c;使开发者能够快速搭建生产级的AI应用…

QML项目实战:自定义Switch按钮

目录 一.添加头文件 1.QtQuick.Controls 2.1 2.QtGraphicalEffects 1.12 二.自定义Switch 三.标签 四.效果 五.代码 一.添加头文件 1.QtQuick.Controls 2.1 QtQuick.Controls 提供了一组预定义的 UI 控件&#xff0c;这些控件可以用于构建现代、响应式的用户界面。它包…

开源框架Openlayers:就业必学,打造3D互动式地图

OpenLayers是一个开源的WebGIS库&#xff0c;支持多种地图类型&#xff0c;提供丰富的功能和API&#xff0c;支持多种格式&#xff0c;可以进行空间分析和可视化&#xff0c;还可以制作融合图层和定制地图。 在招聘市场中&#xff0c;OpenLayers的地位也是不可小觑的&#xff0…

React系列教程(2)React哲学

豆约翰习惯将掌握某一技术分为5个层次&#xff1a;初窥门径&#xff0c;小试牛刀&#xff0c;渐入佳境&#xff0c;得心应手&#xff0c;玩转自如 本篇属于React框架中的第1层次即初窥门径 我们认为&#xff0c;React 是用 JavaScript 构建快速响应的大型 Web 应用程序的首选方…