多种数据结构之间比较

常见的数据结构有:array,list,stack,deque,binaryTree,hashMap,heap,对于C++而言还有最常用的vector

接着分析每一种的特点:

[1] array

内存分配:在内存中分配一段连续的空间;

特点:需要再定义时就知道分配空间的大小;

使用:用于预先就已知需要的最大储存空间的情况;

[2] vector

内存分配:在内存中分配一段连续的空间;

实现:内部实际通过管理一个数组指针实现;

特点:插入的元素如果超出分配的内存空间,会自动划分一段更大的内存空间,将数据拷贝过去后,释放原空间;

使用:对于C++而言采用vector的情况比较多。对于需要随机访问元素,预先不知道需要分配的内存空间大小情况。但是vector在中间和头部插入比较麻烦,插入时间复杂度是O(N);因此vector适用于只在尾部插入和删除的情况;

[3] list

内存分配:随机分配;

实现:通过一个结构体保存指向前一个元素和后一个节点的指针(双向链表);

特点:在任何地方插入都很方便,但是随机访问时间复杂度是O(N);

[4] stack

实现:通过一个表实现很方便,也可以通过数组实现;

特点:后进先出,在编译器中得到广泛应用,例如编译器实现的函数堆栈;

[5] deque

实现:通过一个数组实现;

特点:先进先出,典型应用是多个对象需要抢占同一个资源时;

[6] binaryTree

内存分配:随机分配

实现:保存左右儿子的指针

特点:插入和访问的时间复杂度都是O(logN),内部操作函数的实现很多靠递归来实现。每个节点儿子的个数可以扩展。在操作系统的编译器中的得到广泛应用;

[7] hashMap

实现:分离链接法通过数组和链表实现,开放地址法通过数组实现;

特点:支持随机访问,可以保存到每个数据的信息,可以访问指定的元素。因此应用于需要知道数据信息的情况,比如实现一个词典,就可以将单词存入一个hash表中;

[8] heap

实现:通过数组实现一个完全二叉树,称为堆

时间: 2024-11-06 18:18:22

多种数据结构之间比较的相关文章

深入Linux内核架构 - 内核之中数据结构之间的关系图 & 设备驱动程序(转)

内核之中数据结构之间的关系图 设备驱动程序

多种坐标系之间的转换 Proj.NET和DotSpatial

Proj.NET ( http://projnet.codeplex.com/)是一个.NET下开源的空间参照和投影引擎,遵循OGC相关标准.负责人(Coordinators )是D_Guidi 和SharpGIS,开发者(Developers)还有codekaizen.rstuven等,这些人也是.NET下其他的开源系统如GeoAPI.NET.SharpMap等主要贡献者.License: GNU Library General Public License (LGPL). Proj.NET支

map和jsonObject 这2中数据结构之间转换

前台写json直接是:var array = [ ] ; 调用方法:array[index],若是对象,再["key"] var obj = {''a'':123 , "b":"hello" , "c": array} 调用方法:obj.a 或者 obj["a"] 直接就是var啊 var str = " {''a'':123 , "b":"hello" ,

深入理解nvme协议之二:nvme 协议重点数据结构之间的关系

Physical Region Range(PRP entry) 描述一段物理空间的其实地址和长度,最重要的字段包括: 起始地址(page base address) 偏移大小(offset) 具体如下图所示: Metadata Region 特点:里面的数据不能被split 来传输Metadata may be supported for a namespace as either part of the logical block (creating an extended logical

微信支付id出现的重复支付解决方法和app应用中多种支付方式之间的对比

1.微信支付的transId发起支付请求,未登录微信,先帐号登陆,否则直接去支付.这样的话,该transId跟该帐号绑定起来了, 如果下一次再重新使用该transId来支付请求,但是想切换其他的微信帐号来支付的话,微信就会提示报错信息. 2.所以解决的方法就是每次发起支付请求的时候,transId都是不同的,暂且定义为transId尾号递增1,所以每次进来都是不同的transId,这样就算切换帐号也不会报错. 3.但是根据2的修改方法,在实际的线上运营中,确实有人出现微信多次重复支付的情况,一笔

多种数据库之间的同步工具SymmetricDS

https://github.com/JumpMind/symmetric-ds 跨平台的 --大多数操作系统上运行,包括移动设备,可以同步任何数据库的数据库支持. 多线程 -多线程架构提取.转移和并行加载数据. 渠道 --表分成独立的渠道,有自己的线程同步队列. 自动恢复 --批次错误重试,直到他们成功,所以同步可以从网络故障中恢复过来. 事务意识到 --数据变更记录和回放在相同的顺序和在同一事务. 多主机 --相同的表都可以同步到从主机系统,同时避免更新循环. 转换 --子集,过滤和转换数据

对数据类型和数据结构的思考

1.数据类型在数据结构中的定义是一个值的集合以及定义在这个值集上的一组操作.(事物的内在本质) 每种数据类型都有对应的函数,即每种数据类型本身的函数. 数据类型之间可以通过函数相互转换. 2.数据结构是计算机存储.组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.(事物的外在联系) 每种数据结构都有对应的函数,即每种数据结构本身的函数. 一种数据类型可以构成多种数据结构,比如字符串,可以构成栈,也可以构成队列,也可以构成树,这是对事物的具体应用.

你真的需要掌握多种编程语言吗?(各有九个理由,但必须精一门)

简述 我刚刚断送了自己的职业生涯,没错,很多人都这样对我说. 同事得知我即将离开公司的消息,大多数对此表示理解.但让他们困惑的是,我目前就职的公司是一家Windows商店,用C#.net编写代码,而我要入职的岗位要求在Linux环境下进行开发,以Java为主要的编程语言.他们认为编程语言的改变会让我丢失多年经验,许多人都赞同他们的观点. 编程语言很多,数以百计.有些很常见,例如:Java.C#.PHP.Ruby.Python.和JavaScript,而有些则比较边缘化或是新兴的,例如:Awk.G

【Machine learning(python篇)】-几种常用的数据结构

python中有多种数据结构,数据结构之间也可以相互转化,概念一多就容易使人混淆,对于初学者来说本来很容的概念,最终却变成了噩梦,很难区分不同数据结构之间的用法,这样就会造成乱用数据结构,致使运行效率低下.对于较简单的程序来说乱用数据结构不会有太大的问题,但涉及到大数据运算,可能一个数据类型就会导致内存吃满,这时善用数据结构就会变的尤为重要. 一.list列表类型 list类型是Python中内置的, list中包含的数据之间的类型可以不相同,并且list中数据保存的是数据的指针,因为数据类型不