【深入解析算法】内存使用,应用 上

8.3.6 内存使用
符号表的内存使用
方法N个元素所需的内存(引用类型)
基于拉链法的散列表48N+32M
基于线性探测的散列表在32N和128N之间
各种二叉查找树56N

自计算机发展的伊始,研究人员就研究了(并且现在仍在继续研究)散列表并找到了很多方法来改进我们所讨论过的几种基本算法。你能找到大量关于这个主题的文献。大多数改进都能降低时间.空间的曲线:在查找耗时相同的情况下使用更少的空间,或使在使用相同空间的情况下进行更快的查找。其他方法包括提供更好的性能保证,如最坏情况下的查找成本;改进散列函数的设计等。

拉链法和线性探测法的详细比较取决于实现的细节和用例对空间和时间的要求。即使基于性能考虑,选择拉链法而非线性探测法也不一定是合理的 。在实践中,两种方法的性能差别主要是因为拉链法为每个键值对都分配了一小块内存而线性探测则为整张表使用了两个很大的数组。对于非常大的散列表,这些做法对内存管理系统的要求也很不相同。在现代系统中,在性能优先的情景下,最好由专家去把握这种平衡。

有了这些假设,期望散列表能够支持和数组大小无关的常数级别的查找和插人操作是可能的。对于任意的符号表实现,这个期望都是理论上的最优性能。但散列表并非包治百病的灵丹妙药,因为口每种类型的键都需要一个优秀的散列函数;

1.性能保证来自于散列函数的质量:

2.散列函数的计算可能复杂而且昂贵;

3.难以支持有序性相关的符号表操作。

8.4 应用

在计算机发展的早期,符号表帮助程序员从使用机器语言的数字地址进化到在汇编语言中使用符号名称;在现代应用程序中,符号名称的含义能够通行于跨越全球的计算机网络。快速查找算法曾经并继续在计算机领域中扮演着重要角色。符号表的现代应用包括科学数据的组织,例如在基因组数据中寻找分子标记或模式从而绘制全基因组图谱;网络信息的组织,从搜索在线贸易到数字图书馆;以及互联网基础构架的实现,例如包在网络结点中的路由、共享文件系统和流媒体等。高效的查找算法确保了这些以及无数其他重要的应用程序成为可能。

1.能够快速并灵活地从文件中提取由逗号分隔的信息的一个字典程序和一个索引程序。逗号分隔的格式(及类似格式)常用于存储网络信息。

2.为一组文件构建逆向索引的一个程序。

3.一个表示稀疏矩阵的数据类型。它用符号表处理的问题规模能够远远大于这种数据类型的标准实现。在第6章中,我们会学习一种适合于数据库或者文件系统的符号表,它能够保存的数据量超过你的想象

8.4.1 我应该使用符号表的哪种实现

下表总结了由本章中多个命题和性质得到的各种符号表算法的性能特点(散列表的最坏情况除外,它的结果来自于研究文献并且也不太可能在实际应用中遇到)。从表中显然可以知道,对于典型的应用程序,应该在散列表和二叉查找树之间进行选择。

相对二叉查找树,散列表的优点在于代码更简单,且查找时间最优(常数级别,只要键的数据类型是标准的或者简单到我们可以为它写出满足(或者近似满足)均匀性假设的高效散列函数即可)。二叉查找树相对于散列表的优点在于抽象结构更简单(不需要设计散列函数),红黑树可以保证最坏情况下的性能且它能够支持的操作更多(如排名、选择、排序和范围查找)。大多数程序员的第一选择都是散列表, 在其他因素更重要时才会选择红黑树。我们有时候会遇到这个“第选择”的例外:当键都是长字符串时,我们可以构造出比红黑树更灵活而又比散列表更高效的数据结构。

各种符号表实现的渐进性能的总结
算法(数据结构)最坏情况下的运行时间的增长数量级(N次插入之后) 查找命中平均情况下的运行时间的增长数量级(N次插入之后) 查找命中关键接口内存使用(字节)
顺序查询(无序链表)NN/2equals()48N
二分查找 (有序数组)lgNlgNcompareTo()16N
二叉树查找(二叉树查找)N1.39lgNcompareTo()64N
2.3树查找(红黑树)2lgN1.00lgNcompareTo()64N
拉链法(链表数组)<lgNN/(2M)equals()48N+64N
线性探测法( 并行数组)clgN<1.5hashCode()32N ~128N

我们的符号表实现已经可以广泛应用于各种应用程序,但经过简单的修改后这些算法还可以适应并支持其他一些使用广泛的场景,有必要在这里提下。

8.4.2 原始数据类型

假设我们有一张符号表,其中整型的键对应着浮点型的标准实现值。如果使用我们的标准实现,键和值会被储存在Integer和Double类中,因此我们需要两个额外的引用来访问每个键值对。如果应用程序只会使用几千个键进行几千次查找,那么这些引用可能设什么问题。但如果是对几十亿个键进行几十亿次查找,已吧 空那么这些引用就会造成巨大的额外开销。使用原始数据类型代替Key类型可以为每个键值对节省一个引用。当键的值也是原始数据类型时我们又可以节约另外一个引用。显示了在原始数据类型的实现拉链法中使用原始数据类型的情况,这种交换也适用于符号表的其他实现。

8.4.3 重复键

符号表的实现有时需要专门考虑重复键的可能性。许多应用都希望能够为同一个键绑定多个值。例如在一- 个交易处理系统中,多笔交易的客户属性都是相同的。符号表不允许重复键,因此用例只能自己管理重复键。本节稍后我们会遇到一个这样的示例程序。我们可以考虑在实现中允许数据结构保存重复的键值对,并在查找时返回给定的键所对应的任意值之一。我们也可以加人一个方法来返回给定的键对应的所有值。修改我们实现的二叉查找树和散列表来在数据结构中保存重复的键并不困难。

8.4.5 Java 标准库

Java 的jva.til.TreeMap和java. uil.HashMap分别是基于红黑树和拉链法的散列表的符号表实现。TreeMap没有直接支持rank()、select()和我们的有序符号表API中的一些其他方法, 但它支持一些能够高效实现这些方法的操作。HashMap 和我们的LinearProbingHashST的实现基本相同——它也会动态调整数组的大小来保持使用率大约不超过75%。

为了保持前后一致,我们在本书中一般会使用基于红黑树的符号表或是基于线性探测法的符号表。为了节省篇幅并保证符号表的用例和具体实现的独立性,我们在调用代码中将使用ST来代替有序符号表RedBlackBST,用HashST来代替有序性操作无关紧要且拥有散列函数的LinearProbingHashST.尽管我们知道某些应用可能需要改变或者扩展这些算法和数据结构,我们仍然要这样约定。你应该使用哪种符号表?随便,只要记得测试你的选择是否能够提供所需要的性能就好。

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

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

相关文章

知识融合与消歧:完善知识图谱的关键步骤

知识融合与消歧&#xff1a;完善知识图谱的关键步骤 一、引言&#xff1a;知识融合与消歧的重要性 在今天的数据驱动时代&#xff0c;知识图谱已成为组织和理解海量信息的关键技术。它们使得复杂的数据关系可视化&#xff0c;为人工智能提供了丰富的知识基础。然而&#xff0c…

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(九)- 向量定点算术指令

1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容&#xff1a; 这是一份关于向量扩展的详细技术文档&#xff0c;内容覆盖了向量指令集的多个关键方面&#xff0c;如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…

静态路由协议实验综合实验

需求&#xff1a; 1、除R5的换回地址已固定外&#xff0c;整个其他所有的网段基于192.168.1.0/24进行合理的IP地址划分。 2、R1-R4每台路由器存在两个环回接口&#xff0c;用于模拟连接PC的网段&#xff1b;地址也在192.168.1.0/24这个网络范围内。 3、R1-R4上不能直接编写到…

打造你的专属云开发环境:支持任意 IDE,任意云服务 | 开源日报 No.215

loft-sh/devpod Stars: 6.9k License: MPL-2.0 devpod 是一个开源的、仅限客户端的、不受限制的工具&#xff0c;可以与任何集成开发环境&#xff08;IDE&#xff09;一起使用&#xff0c;并允许您在任何云端、Kubernetes 或本地 Docker 上进行开发。 使用 devcontainer.json…

python文件打包找不到文件路径

引用&#xff1a;【将Python代码打包成exe可执行文件】 https://www.bilibili.com/video/BV1P24y1o7FY/?p4&share_sourcecopy_web&vd_sourced5811f31a0635dfc69a182c7bf1adb8b 在代码中&#xff0c;我们想读取文件a&#xff0c;一般使用如下方法。 import osdir os…

【Ubuntu20.04.6】VMWare Station 17安装Ubuntu20.04.6虚拟机系统

步骤1&#xff1a;下载Ubuntu20.04.6镜像ISO文件 Ubuntu20.04.6镜像ISO文件下载&#xff1a; https://mirrors.ustc.edu.cn/ubuntu-releases/20.04/ 步骤2&#xff1a;下载安装VMWare Station 17 下载和安装教程&#xff1a; https://blog.csdn.net/u012621175/article/deta…

【Docker】搭建开源免费的书签管理系统 - OneNav

【Docker】搭建开源免费的书签管理系统 - OneNav 前言 本教程基于绿联的NAS设备DX4600 Pro的docker功能进行搭建。 简介 OneNav是一个基于PHP的轻量级网址导航系统&#xff0c;旨在帮助用户整理和访问他们的常用网站。 OneNav的主要特点如下&#xff1a; 美观易用&#x…

分享一个基于Multi-SLAM+3DGS的新一代三维内容生产技术

基于智能空间计算&#xff0c;新一代超逼真三维内容生成技术。 可自动化生成超逼真的大场景三维模型&#xff0c;并在各类终端和空间计算设备中&#xff0c;实现前所未有的沉浸式体验。 更可接入专业三维软件和应用平台&#xff0c;进行深度的模型开发与场景落地。 支持超大复杂…

“进击的巨人”:服务器硬件基础知识解析

引言&#xff1a; 服务器是网络环境中负责处理数据、运行应用程序和服务多用户的高性能计算机系统。了解服务器的硬件构成有助于更好地管理和优化IT资源。 服务器和普通PC的差异&#xff1a; 服务器具有比个人电脑更高的处理能力、稳定性和可靠性&#xff0c;它们通常运行在没…

ElasticSearch 中分词与倒排索引的原理

首先是给检索用的。 英文&#xff1a;一个单词一个词&#xff0c;很简单。I am a student&#xff0c;词与词之间空格分隔。中文&#xff1a;我是学生&#xff0c;就不能一个字一个字地分&#xff0c;我-是-学生。这是好分的。还有歧义的&#xff0c;使用户放心&#xff0c;使…

【算法】有序数组的两数之和

题目 在一个有序数组中找到两个数&#xff0c;两个数之和为给定的一个数&#xff0c;返回两个数在数组中的下标。 原理 二分法 以第一个数为基准数&#xff0c;采用二分法寻找数组中与之相加等于给定数的数字&#xff0c;找到则返回下标&#xff0c;否则以第二个数为基准数…

SystemC入门之测试平台编写完整示例:带同步输出的多路选择器

内容&#xff1a;SystemC入门书中的简单测试平台编写示例。 模块文件编写 带锁存输出的4选1多路器模型。输出在信号clock的正跳变沿时刻被锁存。 sync_mux41.h文件 #include <systemc.h>SC_MODULE(sync_mux41) {sc_in<bool> clock, reset;sc_in<sc_uint<…

opencv+python(通道的分离与合并)笔记

分割图像通道&#xff1a; 通过函数mvsplit(img)&#xff1b;mv返回的通道&#xff1b; RGB有3个通道&#xff1b;灰度图只有一个通道&#xff1b; b,g,r cv2.split(img)cv2.imshow("b",b)#通道bcv2.imshow("g",g)#通道gcv2.imshow("r",r)#通道…

c++:局部变量位置和全局变量位置的vector区别

区别&#xff1a;局部变量位置每次都会重置为空&#xff0c;全局不会。但int a[]不管在什么位置都不会重置&#xff08;不进行memset时&#xff09; 代码&#xff1a; 1.局部&#xff1a; #include<bits/stdc.h> using namespace std;int main() {for(int i 0; i <…

React原理

本文主要讲手写React中重要的几个部分&#xff0c;有助于建立对React源码的认知。 1. CreateElement 相信大家一定对jsx不陌生 <div title"box"><p>jsx</p><span>hhh</span> </div>React中的jsx其实就是一个语法糖&#xff0…

微信小程序的页面交互2

一、自定义属性 &#xff08;1&#xff09;定义&#xff1a; 微信小程序中的自定义属性实际上是由data-前缀加上一个自定义属性名组成。 &#xff08;2&#xff09;如何获取自定义属性的值&#xff1f; 用到target或currentTarget对象的dataset属性可以获取数据 &#xff…

基于双向长短期神经网络的碳排放量预测,基于bilstm的碳排放量预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 BILSTM神经网络 基于双向长短期神经网络的碳排放量预测,基于bilstm的碳排放量预测 完整代码: Bilstm双向神经网络碳排放量预测.zip资源-CSDN文库 https://download.csdn.net/download/abc991835105/89087117 效果图 结果分析 展…

c# wpf LiveCharts 简单试验2

1.概要 1.1 说明 1.2 要点 1.2.1 添加命名控件 xmlns:lvc"clr-namespace:LiveCharts.Wpf;assemblyLiveCharts.Wpf" 1.2.2 图片控件 <lvc:CartesianChart Name"chart" LegendLocation"Right"/> 1.3 代码文件引用 using LiveCharts…

LeetCode刷题之31.下一个排列

文章目录 1. 题目2.分析3.解答3.1 先排序&#xff0c;后交换3.2 先交换&#xff0c;后排序 1. 题目 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3…

贪心算法|45.跳跃游戏II

力扣题目链接 class Solution { public:int jump(vector<int>& nums) {if (nums.size() 1) return 0;int curDistance 0; // 当前覆盖最远距离下标int ans 0; // 记录走的最大步数int nextDistance 0; // 下一步覆盖最远距离下标for (int i 0;…