map和hash_map

list支持快速的插入和删除,但是查找费时;

vector支持快速的查找,但是插入费时。

map查找的时间复杂度是对数的,这几乎是最快的,hash也是对数的。 
如果我自己写,我也会用二叉检索树,它在大部分情况下可以保证对数复杂度,最坏情况是常数复杂度,而std::map在任何情况下都可以保证对数复杂度,原因是它保证存诸结构是完全二叉检索树,但这会在存诸上牺牲一些时间。

STL   中的   map   内部是平衡二叉树,所以平衡二叉树的性质都具备。查找数据的时间也是对数时间。 vector,在分配内存上一般要比   new   高效的多。

为什么说   hash_map   是对数级的?在不碰撞的情况下,hash_map是所有数据结构中查找最快的,它是常数级的。 
如果对问题设计了足够好的hash算法,保证碰撞率很低,hash_map的查找效率无可置疑。 
另外,STL的map,它的查找是对数级的,是除hash_map外最高的了,你可以说“也许还有改进余地”,但对于99.9999%的程序员,设计一个比STL   map好的map,我执悲观态度。 
STL的map有平衡策略(比如红黑树什么的),所以不会退化,不需要考虑数据本身的分布问题。只不过,如果数据本身是排好序的,用vector或heap会明显的快些,因为它们的访问比较简单。

我想没必要怀疑stl::map的查找效率,影响效率最主要的因素是什么?算法,在查找问题上,有什么算法比RB_tree更好吗?至少现在还没有。不否 认你可以通过自己写代码,设计一个符合你需要的BR—TREE,比stl::map简捷那么一点,但最多也就每次迭代中少一行指令而已,处理十万个数据多 执行十万行指令,这对你重要吗?如果你不是在设计OS像LINUX,没人会关注这十万行指令花的时间。 
rb-tree的时间花在了插入和删除上,如果你不是对插入和删除效率要求很高,你没有理由不选择基于rb-tree的stl::map。

大多数程序员写不出比std::map更好的map,这是当然的。然而并不是std::map的所有特性都出现在我们的程序中,自己编写的可以更适合自己的程序,的确会比std::map更快一些。

关于hash_map,它与map的实现机制是不一样的,map内部一般用树来实现,其查找操作是O(logN)的,这个没有争议,我就不多说了。 
hash_map的查找,内部是通过一个从key到value的运算函数来实现的,这个函数“只接受key作为参数”,也就是说,hash_map的查找 算法与数据量无关,所以认为它是O(1)级的。来这里的应该都是达人,可以参看《数据结构》。当然,事实总不这样完美,再引一段前面我自已说的话,进一步 说明,以免误会:

----------------------------------------- 
在不碰撞的情况下,hash_map是所有数据结构中查找最快的,它是常数级的。 
------------------------------------------ 
注意我的前提:“在不碰撞的情况下”,其实换句话说,就是要有足够好的hash函数,它要能使key到value的映射足够均匀,否则,在最坏的情况下,它的计算量就退化到O(N)级,变成和链表一样。 
如果说   hash_map   是所有容器中最慢的,也只能说:“最拙劣的hash函数”会使hash_map成为查找最慢的容器。但这样说意义不大,因为,最凑巧的排列能使冒泡排序成为最快的排序算法。

BS: "对于大型容器而言,hash_map能够提供比map快5至10倍的元素查找速度是很常见的,尤其是在查找速度特别重要的地方.另一方面,如果hash_map选择了病态的散列函数,他也可能比map慢得多. "

ANSIC++在1998年之后就没再有重大改变,并且决定不再向C++标准库中做任何重大的变更,正是这个原因,hash   table(包括hash_map)并没有被列入标准之中,虽然它理应在C++标准之中占有一席之地。 
虽然,现在的大多数编译平台支持hash   table,但从可移植性方面考虑,还是不用hash   table的好。

hehe俺也来凑凑热闹。 
1.有的时候vector可以替代map 
比如key是整数,就可以以key的跨度作为长度来定义vector。 
数据规模很大的时候,差异是惊人的。当然,空间浪费往往也惊人。 
2.hash是很难的东西 
没有高效低碰撞的算法,hash_xxx没有意义。 
而对不同的类型,数据集,不可能有优良的神仙算法。必须因场合而宜。 
俺有的解决方法是GP,可不是饭型,是遗传编程,收效不错。

你的百万级的数据放到vector不大合适。因为vector需要连续的内存空间,显然在初始化这个容器的时候会花费很大的容量。 
使用map,你想好了要为其建立一个主键吗?如果没有这样的需求,为什么不考虑deque或者list? 
map默认使用的是deque作为容器。其实map不是容器,拿它与容器比较意义不大。因为你可以配置它的底层容器类型。

如果内存不是考虑的问题。用vector比map好。map每插入一个数据,都要排序一次。所以速度反不及先安插所有元素,再进行排序。

用 binary_search对已序区间搜索,如果是随机存取iterator,则是对数复杂度。可见,在不考虑内存问题的情况下,vector比map 好。

如果你需要在数据中间进行插入,list 是最好的选择,vector   的插入效率会让你痛苦得想死。

涉及到查找的话用map比较好,因为map的内部数据结构用rb-tree实现,而用vector你只能用线性查找,效率很低。

stl还提供了 hash容器,理论上查找是飞快~~~。做有序插入的话vector是噩梦,map则保证肯定是按key排序的,list要自己做些事情。

HASH类型的查找肯定快,是映射关系嘛,但是插入和删除却慢,要做移动操作, LIST类型的使链式关系,插入非常快,但是查找却费时,需要遍历~~ , 还是用LIST类型的吧,虽然查找慢点,

先快速排序,然后二分查找,效率也不低

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

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

相关文章

ubuntu开机报错 system program problem detected

解决方式: sudo gedit /etc/default/apport 将其中的 enable 1改为enable 0

jQuery ajax实现

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>toggle方法</title><meta http-equiv"keywords" content"keyword1,keyword2,keyword3"><meta http-equiv"d…

在MFC程序中增加控制台窗口

MFC程序中&#xff0c;如果想要输出调试信息&#xff0c;我们一般都是TRACE或者使用LOG文件&#xff0c;都不是很方便&#xff0c;第一个需要我们在调试状态下&#xff0c;第二个也要配置麻烦而且不直观。而使用Console来显示调试信息应该是更好的选择。下面介绍几种在MFC程序中…

Kafka安全认证 SASL/PLAINTEXT,账号密码认证

环境 操作系统&#xff1a;CentOS 7.3 Kafka Version&#xff1a;1.1.1 Zookeeper Version:3.4.14 一、Zookeeper集群配置SASL zookeeper所有节点都是对等的&#xff0c;只是各个节点角色可能不相同。以下步骤所有的节点配置相同。 1、zoo.cfg文件配置 为zookeeper添加S…

预处理指令 #pragma 的使用

#pragma comment( comment-type [,"commentstring"] )该宏放置一个注释到对象文件或者可执行文件。comment-type是一个预定义的标识符&#xff0c;指定注释的类型&#xff0c;应该是compiler&#xff0c;exestr&#xff0c;lib&#xff0c;linker之一。commentstring…

Kafka ACL控制,用户权限能控制

本文章基于Kafka配置 SASL/PLAINTEXT后编写&#xff0c;如未配置请参考&#xff1a;https://datamining.blog.csdn.net/article/details/90264636 进行修改 配置kafka server.properties文件 super.users 指定超级用户&#xff0c;不受权限控制 listenersSASL_PLAINTEXT://ip…

ubuntu 系统U盘中 文件出现小锁子

1.插入不有问题的U盘&#xff0c;输入sudo fdisk -l指令&#xff0c;查看磁盘信息。 Disk /dev/sda: 57.6 GiB, 61872793600 bytes, 120845300 sectors Units: sectors of 1 * 512 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optim…

mysql配置

MySQL5.6.11安装步骤&#xff08;Windows7 64位&#xff09; http://jingyan.baidu.com/article/f3ad7d0ffc061a09c3345bf0.html1. 下载MySQL Community Server 5.6.21&#xff0c;注意选择系统类型&#xff08;32位/64位&#xff09; 2. 解压MySQL压缩包 将以下载的MySQL压缩包…

Kafka JMX监控报错 Failed to get broker metrics for BrokerIdentity(128,192.168.2.128,9999,true,false,Map

KafkaManager报错 2019-05-19 14:21:53,817 - [ERROR] k.m.a.c.BrokerViewCacheActor - Failed to get broker metrics for BrokerIdentity(128,192.168.2.128,9999,true,false,Map(SASL_PLAINTEXT -> 19092)) java.rmi.ConnectException: Connection refused to host: 127.…

大数据技术讲解

HDFS的体系架构 整个Hadoop的体系结构主要是通过HDFS来实现对分布式存储的底层支持&#xff0c;并通过MR来实现对分布式并行任务处理的程序支持。 HDFS采用主从&#xff08;Master/Slave&#xff09;结构模型&#xff0c;一个HDFS集群是由一个NameNode和若干个DataNode组…

mfc常见面试题

http://www.mianwww.com/html/2014/05/21208.html 理解c&#xff0b;&#xff0b;语言中一些概念以及它们之间的区别&#xff08;需要深刻理解&#xff09;&#xff1a; &#xff08;1&#xff09;局部变量全局变量静态变量 const常量寄存器变量宏定义的常量 static变量注&…

ubuntu16.04安装gcc g++7.5.0及各个版本的切换

sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update sudo apt-get install gcc-7 sudo apt-get install g-7 出现以下错误&#xff1a; Reading package lists... Done Building dependency tree Reading state information... Done You mi…

eclipse闪退打不开问题

起初在网上看了N多篇的解决文章&#xff0c;可惜都试过了没有一个解决我的问题&#xff0c;后来就一顿折腾&#xff0c;把c盘中出现的 .eclipse&#xff08;点eclipse&#xff09;删除之后重新运行eclipse等待一会儿就可以正常启动了&#xff0c;通过这次警告自己以后不能异常…

掌握技能

掌握技能&#xff1a; 熟悉C/C语言,&#xff0c;熟悉常用的设计模式及设计原则&#xff1b; 熟悉常用的重构手法&#xff0c;有良好的编码风格&#xff1b; 熟练使用VS2010集成开发环境和SVN版本控制系统&#xff1b; 熟悉MFC、Qt库的使用&#xff1b; 熟悉C标准程序库STL以及常…

kafka manager 2.0 工具下载 已打包完成

链接&#xff1a;https://pan.baidu.com/s/1YMj-9HzoJLKDEY5C47aOlQ 提取码&#xff1a;hhhr

linux系统备份和恢复

系统备份&#xff1a; sudo su cd / tar cvpzf backup.tgz --exclude/proc --exclude/lostfound --exclude/backup.tgz --exclude/mnt --exclude/sys --exclude/media / 系统恢复&#xff1a; ctrl alt F1 输入用户名和密码 cd / sudo tar xvpfz backup.tgz

多线程Runnable类创建多线程

package com.ajax; //多线程Runnable类创建多线程 public class Example01 {public static void main(String [] args){TicketWindow twnew TicketWindow();new Thread(tw,"窗口1").start();new Thread(tw,"窗口2").start();new Thread(tw,"窗口3&quo…

LPTSTR、LPCSTR、LPCTSTR、LPSTR的区别

UNICODE&#xff1a;它是用两个字节表示一个字符的方法。比如字符A在ASCII下面是一个字符&#xff0c;可A在UNICODE下面是两个字符,高字符用0填充&#xff0c;而且汉字程在ASCII下面是两个字节&#xff0c;而在UNICODE下仍旧是两个字节。UNICODE的用处就是定长表示世界文字&…

Hbase快照Snapshot 数据备份、恢复与迁移

场景 hbase数据迁移时我们需要统计迁移时的数据量&#xff0c;以确保迁移后的数据的完成&#xff0c;但是如果hbase表数据持续增加的话&#xff0c;迁移时无法统计出准确的数据量&#xff0c;此时我们使用快照的方式进行数据迁移&#xff0c;以确保迁移的数量可以和某一时间节点…

多线程Thread类创建多线程

package com.ajax; //多线程Thread类创建多线程 public class Example02 {public static void main(String[] args){new MyThread().start();new MyThread().start();new MyThread().start();//创建一个线程对象并开启new MyThread().start();} } class MyThread extends Threa…