哈希表(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)配置管理、数据序列化

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

达梦数据守护集群_动态增加实时备库

目录 1、概述 2、实验环境 2.1环境信息 2.2配置信息 2.3 查看初始化参数 3、动态增加实时备库 3.1数据准备 3.2配置新备库 3.3动态增加MAL配置 3.4 关闭守护进程及监视器 3.5修改归档&#xff08;方法1&#xff1a;动态添加归档配置&#xff09; 3.6 修改归档&…

思维导图工具有哪些?10款思维导图特色介绍

电脑的普及&#xff0c;互联网的便捷。使我们平时工作、学习等场景下&#xff0c;常常离不开思维导图的辅助。思维导图是可以让我们所需要介绍的知识点以图文形式结合&#xff0c;展示出来。帮助我们方便理解。因此&#xff0c;一款好的思维导图工具&#xff0c;能让我们制作的…

7.2 设计模式

设计模式 7.3.1 设计模式的要素7.3.2 创建型设计模式7.3.3 结构性设计模式1. Adapter (适配器)2. Bridge(桥接)3.Composite(组合)4.Decorator(装饰)5.Facade(外观)6.Flyweight(享元)7.Proxy(代理)8. 结构型模式比较 7.3.4 行为型设计模式1 Chain of Responsibility 责任链模式2…

【Wi-Fi】802.11ac wave1 vs 802.11ac wave2

参考链接 difference between 11ac wave1 and wave2 | 11ac-wave1 vs 11ac-wave2 什么是802.11ac和802.11ac Wave2 - 华为 Notes&#xff5c;802.11ac Wave1与Wave2 - 知乎 802.11ac-wave1 2013年&#xff0c;IEEE发布了802.11ac标准&#xff0c;在Wave2出来之后&#xf…

【浪潮商城-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

【MWorks】Ubuntu 系统搭建

升级 Ubuntu系统 sudo apt-get update sudo apt-get upgrade安装流程 sudo chmod x 路径/文件.run安装 sudo 路径/文件.run安装过程中两个选项都填 y 打开安装对应的文件夹 运行 syslab.sh 文件&#xff0c;运行结束后&#xff0c;就可以在左上角开始搜索到syslab了。

单测篇 - 如何mock静态常量

本文对应源码地址&#xff1a; https://github.com/nieandsun/NRSC-STUDY/tree/master/nrsc-unit-test-study 1 如何mock静态常量 先看如下代码&#xff0c;这里如何对方法中的静态常量DEMO_CONSTANT进行mock呢&#xff1f; public class Demo1StaticConstant {/**** 这里的类…

学习方法该升级了,‌AI时代的弯道超车:【心流学习法】行动与意识合一的巅峰进化

你是否曾感到内心如荒漠般干涸&#xff0c;面对浩瀚的知识海洋&#xff0c;热情逐渐消磨殆尽&#xff1f; 你是否渴望忘却时间的流逝&#xff0c;心无旁骛&#xff0c;与知识展开一场纯粹而深邃的对话&#xff1f; ​在AI时代&#xff0c;智能体处理数据、知识迭代的速率让人…

Set

1.概念 Set与Map一样是一个接口&#xff0c;是一颗搜索树&#xff0c;所以在创建Set对象时&#xff0c;必须实现其类&#xff08;HashSet或TreeSet&#xff09; Set<String> setnew HashSet<>(); 2.常用方法 注意 Set中只存储key&#xff0c;并且要求key唯一Set…

蓝桥杯真题——三角回文数(C语言)

问题描述 对于正整数 n, 如果存在正整数 k 使得 n123⋯kk(k1)2n123⋯kk(k1)/2​, 则 n 称为三角数。例如, 66066 是一个三角数, 因为 66066123⋯36366066123⋯363 。 如果一个整数从左到右读出所有数位上的数字, 与从右到左读出所有数位 上的数字是一样的, 则称这个数为回文数…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01目录1. A Perspective for Adapting Generalist AI to Specialized Medical AI Applications and Their Challenges2. Synergi…

C++练习题(2)

//C计算自然数的和 #include <iostream> using namespace std; int main() { int n,sum0; scanf("%d",&n); for(int i0;i<n;i) { sumi; } printf("%d",sum); return 0; } #include <iostream> …

心觉:如果做不到“道生一”,能做到“一生道”也不得了

Hi&#xff0c;我是心觉&#xff0c;带你用潜意识化解各种焦虑、内耗&#xff0c;建立无敌自信&#xff1b;教你财富精准显化的实操方法&#xff1b;关注我,伴你一路成长&#xff01; 每日一省写作222/1000天 想学的东西太多&#xff0c;想练的能力太多&#xff0c;想重塑的负…

Centos开机自启动脚本示例

本文建议创建一个sh文件管理自启动的各项内容&#xff0c;再将sh文件设置开机启动 在/root/autoshell下创建一个autostart.sh&#xff0c;内容如下 #!/bin/bash # description:开机自启脚本# 启动mongodb sh /root/software/mongodb-linux-x86_64-rhel70-4.0.6/bin/mongod --c…

查看网路信息-ifconfig命令

1.ifconfig缺点: 可以查看接口的网络类型;部分IP和掩码以及状态是否插线,看不到接口下的网关,DNS, 要想看到接口下多个IP,使用 ip addr show 命令 要想看网关,使用 ip route show 命令、route -n 命令 显示路由表内容,route -n 命令 route -n命令主要用于手动配置静态…

buu PWN5

在做这道题目之前&#xff0c;我们先来了解一下什么是字符串格式化漏洞&#xff0c;格式化字符串函数就是将计算机 内存中表示的数据转化为我们人类可读的字符串格式&#xff0c;下面记几个有用的 %d十进制 输出十进制整数 %s 从内存中读取字符串 %p 指针地址 %n 到目前…

[Android]从FLAG_SECURE禁止截屏看surface

在应用中&#xff0c;设置activity的flag为FLAG_SECURE就可以禁止截屏&#xff0c;截屏出来是黑色的&#xff0c; 试验一下&#xff0c; 注意事项 影响&#xff1a; 设置 FLAG_SECURE 标志后&#xff0c;用户将无法对该Activity进行截屏或录制屏幕。这个标志会影响所有屏幕录…

【FL0013】基于SpringBoot和微信小程序的机电公司管理信息系统

&#x1f9d1;‍&#x1f4bb;博主介绍&#x1f9d1;‍&#x1f4bb; 全网粉丝10W,CSDN全栈领域优质创作者&#xff0c;博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战&#xff0c;以及程序定制化开发…

[渲染层网络层错误] net::ERR_CONTENT_LENGTH_MISMATCH 问题解决

问题描述 问题背景 微信小程序访问后端img资源的时候&#xff0c;偶尔出现这个感叹号&#xff0c;图片加载不出来&#xff0c;但是对应的url贴出来在浏览器中访问&#xff0c;或者重新加载是可以访问的。 错误描述 经查询前端报错 [渲染层网络层错误] net::ERR_CONTENT_LE…

【C++】踏上C++学习之旅(五):auto、范围for以及nullptr的精彩时刻(C++11)

文章目录 前言1. auto关键字&#xff08;C11&#xff09;1.1 为什么要有auto关键字1.2 auto关键字的使用方式1.3 auto的使用细则1.4 auto不能推导的场景 2. 基于范围的for循环&#xff08;C11&#xff09;2.1 范围for的语法2.2 范围for的使用条件 3. 指针空值nullptr&#xff0…