Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么要使用数组来实现“列表”而不是哈希表呢?

为什么要使用数组来实现“列表”而不是哈希表呢?
EN

Stack Overflow用户
提问于 2010-02-15 16:29:18
回答 4查看 1.1K关注 0票数 4

考虑一个数组和一个哈希表,在哈希表中,键只是一个列表的整数索引。

它们的平均大小写插入、查找和删除大O界限都是O(1)常量时间。我知道使用数组可能会在缓存局部性方面获得一些低级别的胜利,哈希表操作有一个边际(几乎是恒定的)开销,但哈希表可以免费获得稀疏性,这在某些应用程序中是一个很大的胜利。

我还遗漏了哪些重要的(或小的)对比?

上下文:在面试编程候选人时,我有时会对此进行讨论。通常上下文是“如何在JS中实现Javascript数组类型?”对于密集打包的数据,我支持原生数组,但我希望有更好的推理,而不是“它看起来不像是过度杀伤力”的直觉。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-16 10:31:50

数组是哈希表的一个特例,其中哈希函数非常简单

代码语言:javascript
运行
AI代码解释
复制
f(x) := x;

并且所使用的模数与数据字大小(以及因此数组大小)相同。

如果你不允许非唯一的值,你就不需要"next“指针,瞧,我们有一个数组。

由于没有复杂的哈希函数和模运算,这是非常快的,但只有当数组可以保持小的时候才适用(具有大量空位的非常大的数组浪费内存资源,并可能触发交换/回收到磁盘的麻烦事情)。

票数 5
EN

Stack Overflow用户

发布于 2010-02-16 16:37:08

当你从一个想要实现Javascript的伪数组行为的人的角度来看,你是对的,哈希表是做这件事的更好的方法,特别是。因为Javascript数组没有固定长度,并且需要能够容纳任何索引处的条目。Javascript中的数组看起来像数组,但行为更像哈希表。

但是在一种更接近机器的语言中,对于可以有效地存储在数组中的数据,使用实数组的性能和空间优势是相当值得注意的,特别是因为使用哈希表的好处仅限于稀疏数组,这不是您将使用或应该使用的数组。实际上,使用具有整数键的哈希表可以更好地完成此任务。

在所有情况下,数组的插入、查找和删除也是O(1),但它的常数O比哈希表低得多(这不仅仅是因为缓存的局部性)。并且数组每个条目所需的空间更少。如果您希望删除和插入条目的方式使后面的条目相应地更改它们的索引,那么它将是O(n),其中n是需要移动的条目的数量,但是对于哈希表来说,这样做也是O(n),并且具有更高的常量开销。这是一种你最好使用链表的操作。此外,增加一个数组比增加一个可能需要重新计算所有条目的哈希表的成本更低。

所有不同的集合类型都有其特定的优点和缺点。这就是为什么有这么多人在使用它们。

票数 2
EN

Stack Overflow用户

发布于 2010-02-15 16:32:32

因为列表通常是有序的,而哈希表则不是。在将元素添加到列表中并期望顺序保持一致的上下文中,哈希表不能保证您返回的顺序,而数组保留了顺序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2267331

复制
相关文章
为什么是AUC值而不是GSEA来挑选转录因子呢
通过学习,我们知道这个RcisTarget包内置的motifAnnotations_hgnc是16万行,可以看到每个基因有多个motif。而且下载好的 hg19-tss-centered-10kb-7species.mc9nr.feather 文件,也是 24453个motifs的基因排序信息。但是我们留下来了一个悬念,如何从几万个注释结果里面挑选到最后100个富集成功的motif呢?
生信技能树
2020/12/03
1.3K0
为什么是AUC值而不是GSEA来挑选转录因子呢
[PHP] PHP数组的哈希表实现
1.HashTable中的有个字段记录元素个数,每插入一个元素或者unset删掉元素时会更新这个字段。这样在进行count()函数统计数组元素个数时就能快速的返回。
唯一Chat
2020/12/31
1.3K0
散列表(哈希表)
概述 什么是散列表? 如果说起它的另一个名字, 你一定很熟悉, 它的英文叫"Hash Table", 哈希表, 很熟悉吧. 散列的思想, 其实就是利用数组的随机访问特性, 将key-value形式的数
烟草的香味
2019/07/25
6760
散列表(哈希表)
序言: 如果将一系列的记录按照关键字的某种函数存储,那么在查找某个数据的时候就可以直接通过关键字计算出来了,而不在需要“比较”,这样会非常高效,这就是散列技术。 所以散列技术就是:     存储位置=f(关键字)        不管是记录的存储还是查找,都用这种方法 散列技术具有很高的效率,但是使用起来有一些限制。如1个关键字对应多个记录的情况(比如在一个学校的学生中按性别查找,则对应太多的记录),此外散列技术同样不适合于范围查找和排序等操作。 一、散列函数的构造 在设计散了函数的时候主要考虑两个原则: (
用户1215536
2018/02/05
7160
散列表(哈希表)
版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/83998492
zy010101
2019/05/25
7430
使用HSB而不是RGB来定义颜色
有多种方法可以在代码中定义颜色。最常用的方法是指定三种基色的值 - 红色、绿色和蓝色 (RGB)。本文通过指定色调、饱和度和亮度 (HSB) 的值来探索替代机制的使用。可以以更直观的方式使用 HSB 属性来创建颜色搭配良好的调色板。
韦弦zhy
2023/01/06
2.8K0
使用HSB而不是RGB来定义颜色
为什么数组下标从 0 开始?而不是 1?
鱼皮最新原创项目教程,欢迎学习 大家好,我是鱼皮。很多小伙伴初学编程的时候都被元素下标折磨过,为什么很多编程语言要把 0 作为第一个下标索引,而不是直观的 1 呢? 这个问题 Dijkstra 已经解答过了,没错,就是你知道的 Dijkstra,Dijkstra 最短路径算法,荷兰语全名是 Edsger Wybe Dijkstra,于 1972 年获得了图灵奖,除了上面说的最短路径算法,还有众所周知的信号量和 PV 原语、银行家算法等也是这位巨佬提出的。 原文在这里:https://www.cs.u
程序员鱼皮
2023/03/29
9720
为什么数组下标从 0 开始?而不是 1?
[PHP] PHP数组的实现哈希表(HashTable)结构
PHP中使用最为频繁的数据类型非字符串和数组莫属,使用哈希表实现的PHP数组。 1.数据结构:保存哈希表容器,保存数据的容器 2.哈希函数实现:需要尽可能的将不同的key映射到不同的槽(bucket)中,首先我们采用一种最为简单的哈希算法实现,将key字符串的所有字符加起来,然后以结果对哈希表的大小取模,这样索引就能落在数组索引的范围之内了 3.操作接口函数:初始化,查找,插入,删除,销毁
唯一Chat
2019/09/10
1.2K0
分布式锁为什么要选择Zookeeper而不是Redis?
在分布式的应用中,为了防止单点故障,保障高可用,通常会采用主从结构,当主节点挂掉后,从节点可以代替主节点提供服务。
烂猪皮
2021/06/10
9851
为什么建议使用你 LocalDateTime ,而不是 Date?
多线程并发如何保证线程安全 - 避免线程之间共享一个SimpleDateFormat对象,每个线程使用时都创建一次SimpleDateFormat对象 => 创建和销毁对象的开销大 - 对使用format和parse方法的地方进行加锁 => 线程阻塞性能差 - 使用ThreadLocal保证每个线程最多只创建一次SimpleDateFormat对象 => 较好的方法
芋道源码
2019/10/23
1.6K0
JDBC为什么要使用PreparedStatement而不是Statement
前言 这篇博客不是我写的,是由刘志军大大翻译的,真心觉得很棒,而且是必学要掌握的东西,所以就转载过来了,我个人的第一篇转载文章。 开始 PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。同时Prepar
roobtyan
2018/06/04
1.5K0
JDBC为什么要使用PreparedStatement而不是Statement
PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(sql)方法可以获得PreparedStatment对象。数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快。下面是一个例子:
哲洛不闹
2018/09/19
1.1K0
JDBC为什么要使用PreparedStatement而不是Statement
JDBC为什么要使用PreparedStatement而不是Statement
PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(sql)方法可以获得PreparedStatment对象。数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快。下面是一个例子:
哲洛不闹
2018/09/19
9750
JDBC为什么要使用PreparedStatement而不是Statement
为什么建议使用你LocalDateTime,而不是Date?
在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗?
良月柒
2019/10/28
1.5K0
为什么建议使用你LocalDateTime,而不是Date?
JDBC为什么要使用PreparedStatement而不是Statement
PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。同时PreparedStatement还经常会在Java面试被提及,譬如:Statement与PreparedStatement的区别以及如何避免SQL
java达人
2018/01/31
3.8K0
为什么建议使用你 LocalDateTime ,而不是 Date?
来源:juejin.im/post/5d7787625188252388753eae
用户1516716
2019/10/24
1.1K0
为什么建议使用你 LocalDateTime ,而不是 Date?
来源:juejin.im/post/5d7787625188252388753eae
JAVA葵花宝典
2019/10/29
1.1K0
为什么建议你使用LocalDateTime而不是Date?
calendar是共享变量,并且这个共享变量没有做线程安全控制。当多个线程同时使用相同的SimpleDateFormat对象【如用static修饰的SimpleDateFormat】调用format方法时,多个线程会同时调用calendar.setTime方法,可能一个线程刚设置好time值另外的一个线程马上把设置的time值给修改了导致返回的格式化时间可能是错误的。在多并发情况下使用SimpleDateFormat需格外注意SimpleDateFormat除了format是线程不安全以外,parse方法也是线程不安全的。parse方法实际调用alb.establish(calendar).getTime()方法来解析,alb.establish(calendar)方法里主要完成了
Bug开发工程师
2020/03/12
2.1K0
什么是散列表(哈希表)?
假设你们班级100个同学每个人的学号是由院系-年级-班级和编号组成,例如学号为01100168表示是1系,10级1班的68号。为了快速查找到68号的成绩信息,可以建立一张表,但是不能用学号作为下标,学号的数值实在太大。因此将学号除以1100100取余,即得到编号作为该表的下标,那么,要查找学号为01100168的成绩的时候,只要直接访问表下标为68的数据即可。这就能够在O(1)时间复杂度内完成成绩查找。
编程珠玑
2019/07/12
6470
哈希表(散列表)原理详解
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构 。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
233333
2019/05/25
8.8K0

相似问题

为什么要使用数组而不是哈希呢?

43

哈希表必须使用数组来实现吗?

15

为什么使用数组而不是链接列表来实现IEnumerable(或IList)?

35

在使用嵌套属性时,为什么要获得哈希而不是数组?

20

为什么要使用“基于质数的”哈希码实现而不是“天真的”哈希码呢?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档