精华内容
下载资源
问答
  • 动态数组链表数据结构.docx
  • 数组链表存储结构

    2020-09-18 11:19:13
    数组链表、二叉树、HashMap 数组链表 1、数组是将元素在内存中连续存放。  链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。 2、数组必须事先定义固定的长度,不能适应数据动态的...

    本文主要说一下数组、链表、二叉树、HashMap存储结构,及其优缺点。

    数组和链表

    1、数组是将元素在内存中连续存放。
       链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。
    2、数组必须事先定义固定的长度,不能适应数据动态的增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;
       链表动态地进行存储分配,可以适应数据动态地增减的情况。
    3、(静态)数组从栈中分配空间,对于程序员方便快速,但是自由度小;
        链表从堆中分配空间,自由度大但是申请管理比较麻烦。

    黄色数组,蓝色链表结构

    链表:单链表、双向链表、循环链表

    由其存储结构可以看出:数组在查询效率比较高直接通过索引就查询,插入和删除效率低,因为要移动后面所有元素。链表在查询效率上低,但是插入删除效率高

    二叉树

    几种特殊的二叉树:满二叉树、完全二叉树、平衡二叉树

    满二叉树:全是满的

    完全二叉树:如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。

    平衡二叉树:

    二叉树可以采用顺序存储结构和链式存储结构。对于完全二叉树和满二叉树采用顺序存储结构比较适合

    1)一个完全二叉树如下:

    2)但是对于一般的二叉树如下,是不是很浪费空间。

    再看极限的,abcd4个元素需要15个长度的数组来存,实在是太浪费了。

    3)在2)中我们呢看到这种不适合用数组。

    我们用二叉链表

    为了方便访问某结点的双亲,还可以给链表结点增加一个双亲字段parent,用来指向其双亲结点。这种叫三叉链表

    HashMap

    数组+链表+红黑树。

    传入的数组长度必须是2的指数次幂。如果传入13,在put会转成大于13最接近2的指数次幂的值,那就是16了。

    为什么必须是2的指数次幂?

    先留着

    hash冲突?

    不同的entry通过哈希函数等计算出来下标一样,就叫hash冲突

    解决hash冲突?

    一种是开放寻址法,另一种是链表法,好像好有其他方法。

    开放寻址法:

    比如计算出Entry6的下标是2,但是2下标已经有值了,就往后找,3也被占了,4没有则放入4.

    链表法:

    链表法也正是被应用在了HashMap中,HashMap中数组的每一个元素不仅是一个Entry对象,还是一个链表的头节点。每一个Entry对象通过next指针指向它的下一个Entry节点。当新来的Entry映射到与之冲突的数组位置时,只需要插入到对应的链表中即可

    Java 1.8以后是数组+单链表+红黑树(链表>8时转成红黑树)

    链表缺点就是查询效率低,如果链表太长,那么效率也低,红黑树是接近于平衡的二叉树,远远高于链表的查询效率。

    展开全文
  • 上一篇中的类LinkList 是链表类,类中有对链表的各种操作,要把链表和数组联系起来,就要定义一个链表类型的数组:LinkList arr [ ] ,我们要把数组中的每个元素都映射为一个链表,通过计算可以得出: ...

    用处:链表数组一般用于在不借用数据库的情况下,对于大量数据的临时存储,来实现快速查找的功能。

    嵌套实现思想:上一篇中已经讲了链表的创建和操作,借用上一篇中的部分来进行说明。上一篇中的类LinkList 是链表类,类中有对链表的各种操作,要把链表和数组联系起来,就要定义一个链表类型的数组:LinkList  arr [ ] ,我们要把数组中的每个元素都映射为一个链表,通过计算可以得出:

      例如:

    假设要存入10000个数,我们定义链表数组的长度为100,在我们向链表中每存入一个数的时候,先让这个数对100取余;10000个数对100取余的结果是0-99,那么我们把得到的0-99作为LinkList arr[ ] 的索引,结果我们就会得到一个链表数组 LinkList arr [0-99 ],这样操作就算是把LinkList的数组大小得到了(通过计算映射到LinkList数组中的);接下来我们

    把相应的值放入到LinkList arr[] 链表数组中的链表中,还是按照上面的计算把需要放入的数值和100进行求余:

    例如:int  a = 155;

     Int  b = a%100;  // b = 55

    那么就把数值 存放到 arr[  b  ] 

    10000个数存放到LinkList arr 中 被分成了100组,第一组是 一个数与100取余 余数全为 的数 都被存放到了 arr[ 0 ] 的链表中,第二组是 一个数与100取余 余数全为 的数 都被存放到了 arr[ 1 ] 的链表中........第十组是 一个数与100取余 余数全为 的数 都被存放到了 arr[ 9 ] 的链表中。这样就分类的把10000个数存放到了数组链表LinkList arr中。

    那么当我们查找这10000的任意一个数 int  ran 的时候。就可以用int  posit = ran%100; 这个时候我们就可以知道 ran 被存储在数组链表arr[ posit ] 中,我们遍历查找的时候仅仅遍历链表 arr[ posit ] 就可以得到这个数ran 了。

    如果使用for循环查找ran 的话,如果ran 10000中的最后一个位置上 就需要遍历查找10000次;相比而言,使用链表数组最多遍历100次就够了,这样就把查找次数相比for循环缩小了100倍,从而达到快速查找的目的,欧耶 终于写完了 下面贴代码(代码中的每个元素是对象) 嘎嘎~~

    public class A {
    	public int length;
    	public int index;
    	public LinkList arr[];
    	public A(int length){
    		this.length=length;
    		arr=new LinkList[length];
    	}
    	public A(){
    		this.length=1000;
    		arr=new LinkList[length];		
    	}
    	public LinkList Hash(int a){	//应用到学生类中,对应 a 的为学生的ID
    		int index=a%length;		//计算得到链表数组的索引
    		if(arr[index]==null){
    			LinkList lk1 = new LinkList();
    			arr[index]=lk1;
    			return arr[index];	//返回找到的链表数组中的一个链表
    		}
    		return arr[index];
    	}
    	/*
    	 * 
    	 * 下面这些方法都是对数组中的链表进行操作
    	 */
    	public void addHeadNode(NodeData data){	//传过来一个学生对象data 
    		int key=data.getKey();	//通过一个方法 获取到学生的ID, key为得到的学生ID
    		LinkList lk=Hash(key);
    		lk.addHeadNode(data);	//程序走到这里的时候会调用LinkList 类中的 添加节点操作
    	}
    	public void addTailNode(NodeData data){	
    		int key=data.getKey();
    		LinkList lk=Hash(key);
    		lk.addTailNode(data);	//程序走到这里的时候会调用LinkList 类中的 添加节点操作
    	}
    	public void delNode(NodeData data){
    		int key=data.getKey();
    		LinkList lk=Hash(key);
    		lk.delNode(data);		//程序走到这里的时候会调用LinkList 类中的 删除节点操作
    	}
    	public void findNode(NodeData data){
    		int key = data.getKey();
    		LinkList lk=Hash(key);
    		lk.findNode(data);		//程序走到这里的时候会调用LinkList 类中的 查找节点操作
    	}
    	public void updNode(NodeData data){
    		int key = data.getKey();
    		LinkList lk = Hash(key);
    		lk.updNode(data);		//程序走到这里的时候会调用LinkList 类中的 更新节点操作
    	}
    }
    

    总结一下 归根结底到最后还是对具体的链表进行的操作,只不过是把链表通过一定的规则放到了数组中,提高了查找的效率~~~奋斗得意~



    展开全文
  • 数组 链表

    2018-08-11 19:33:17
    结构在通过索引进行查询数据是效率比较高,而对于数组插入和删除操作则效率比较低,在第一个位置进行插入数据时,其它数据就需要依次后移,而删除一个数据,则该数据后的数据全部前移。 链表: 为了保证数据插入和...

    数组:

    结构在通过索引进行查询数据是效率比较高,而对于数组插入和删除操作则效率比较低,在第一个位置进行插入数据时,其它数据就需要依次后移,而删除一个数据,则该数据后的数据全部前移。

    链表:

    为了保证数据插入和删除不会影响其它数据的移动,保证线性开销,所以引出了链表。每个值都不会连续进行存储。链表是由一系列节点组成,每一个节点都有一个链点,就是next链。而next链则会执行下一个node引用,所以我们在插入和删除数据的时候,需要该链表next链的指向地址即可,每个节点不需要内存进行连续存储,这样会减少删除和插入的线性开销。

     

    从逻辑结构上看:

    1:数组必须事先定义固定的长度,不能实行动态数据的增减。当数据增加时,可能超出原先定义的元素个数,出现溢出现象。当数据减少时,造成内存浪费。数组中增减数据时需要移动其他数据。

    2:链表动态的进行了存储分配,可以适应数据动态的增减,且方便的插入和删除数据。

     

    从内存来看:

    1(静态)数组从栈中分配空间,对于程序员来说方便快速,但自由度小。

    2链表从堆中分配空间,自由度大,但申请管理比较麻烦

     

    。。。该博文为摘抄  关于动态数组  及  单双向链表  没写  有机会补上

    展开全文
  • 数组 链表 哈希表

    千次阅读 2017-12-13 15:04:31
    数组 链表 哈希表

    数组
    这里写图片描述

    数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小。而在实际应用中,用户使用数组之前有时无法准确确定数组的大小,只能将数组定义成足够大小,这样数组中有些空间可能不被使用,从而造成内存空间的浪费。
    数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数,造成数组越界;当数据减少时,造成内存浪费。

    特点

    1.数组是相同数据类型的元素的集合
    2.数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起
    3.数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如,a[0]表示名字为a的数组中的第一个元素,a[1]代表数组a的第二个元素,以此类推。

    链表
    这里写图片描述
    链表有很多种不同的类型:单向链表,双向链表以及循环链表。

    链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。

    使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。

    区别
    链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。因为数组中插入、删除数据项时,需要移动其它数据项,而链表的插入与删除时,只需要改变个别元素之间的关系即可,这大大提高了链表的删除与插入的速度。
    链表是一种常见的数据组织形式,它采用动态分配内存的形式实现。需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费

    哈希表

    散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
    这里写图片描述
    左边是个数组,数组的每个成员包括一个指针,指向一个链表的头,当然这个链表可能为空,也可能元素很多。我们根据元素的一些特征把元素分配到不同的链表中去,也是根据这些特征,找到正确的链表,再从链表中找出这个元素。

    哈希表优缺点

    优点:不论哈希表中有多少数据,查找、插入、删除(有时包括删除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。
    哈希表运算得非常快,在计算机程序中,如果需要在一秒种内查找上千条记录通常使用哈希表(例如拼写检查器)哈希表的速度明显比树快,树的操作通常需要O(N)的时间级。哈希表不仅速度快,编程实现也相对容易。
    如果不需要有序遍历数据,并且可以提前预测数据量的大小。那么哈希表在速度和易用性方面是无与伦比的。

    缺点:它是基于数组的,数组创建后难于扩展,某些哈希表被基本填满时,性能下降得非常严重,所以程序员必须要清楚表中将要存储多少数据(或者准备好定期地把数据转移到更大的哈希表中,这是个费时的过程)。

    java集合的主要分为三种类型:
    Set(集)
    List(列表)
    Map(映射)
    几乎有有的集合都是基于数组来实现的.
    因为集合是对数组做的封装,所以,数组永远比任何一个集合要快

    List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)

    Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。 Set接口主要实现了两个实现类:
    HashSet: HashSet类按照哈希算法来存取集合中的对象,存取速度比较快
    TreeSet :TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。
    Set 的用法:存放的是对象的引用,没有重复对象

    List的特征是其元素以线性方式存储,集合中可以存放重复对象。

    List接口主要实现类包括:
    ArrayList() : 代表长度可以改变得数组。可以对元素进行随机的访问,向ArrayList()中插入与删除元素的速度慢。
    LinkedList(): 在实现中采用链表数据结构。插入和删除速度快,访问速度慢。

    展开全文
  • 常用结构有栈、队列、数组链表和红黑树 1)栈:先进后出 2)队列:先进先出 注意出入口的位置 3)数组 查询快 因为数组的地址是连续的 ,我们可以通过数组的首地址找到数组,通过数组的索引可以快速查找某一...
  • 数据结构课程设计文档,使用的是数组链表的数据结构,编写的是一个统计文本某些单词个数和位置的程序。
  • 数组链表是两种基本的数据结构,他们在内存存储上的表现不一样,所以也有各自的特点 数组 一、数组的特点 1.在内存中,数组是一块连续的区域 2.数组需要预留空间 在使用前需要提前申请所占内存的...
  • 数组链表堆栈和队列

    2013-04-28 23:50:58
    数组链表堆栈和队列是最基本的数据结构,任何程序都会涉及到其中的一种或多种。 1数组   数组是最最基本的数据结构,很多语言都内置支持数组。数组是使用一块连续的内存空间保存数据,保存的数据的个数在分配...
  • 数据结构java(一)数组链表

    千次阅读 2019-03-05 21:10:34
    链表是数据结构中最基础的内容,链表在存储结构上分成两种:数组形式储存,链式存储。 相比c语言需要的结构体,在java中由于有了面向对象编程,将指针‘藏’了起来,不需要分配内存。 所以只需要创建一个对象数组...
  • java数组链表

    2018-02-24 13:35:08
    数组 1、数组通过下标设置值和获取值,效率高。 2、插入和删除效率低。每次插入或者删除一个元素,可能需要移动大量元素,其平均移动次数是顺序...1、链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素...
  • Java中HashMap底层为什么是数组链表

    千次阅读 热门讨论 2019-03-21 11:50:55
    之后被问到HashMap底层为什么是数组链表呢?这样的话,链表一长,在链表中查询的效率不是很低吗? 我:(哑了) 最近看到一个比较有依据的答案,在此做一下答复。 HashMap底层为什么是数组链表呢?在链表中查询的...
  • 自己写的一个小项目。用数组模拟实现java的数据结构,性能还行。和源码思路比较接近。可以看看,有助于初学者了解数据结构与算法。
  • 数组链表hashmap底层

    千次阅读 2018-03-11 09:17:49
    数组链表的区别:数组是有序的,方便查询(数组下标是依次递增的,因此可以根据下标来进行二叉树查询) 但是不便于新增或删除,每当插入或删除一个元素时,之后的元素就会重新排列位置获得新的下标。 (思考:这...
  • 对有志于学习数据结构的人们有很大的帮助,内容详尽,易看易懂。能提高学习效率,在玩中就能学习,并收到意想不到的效果。
  • 数组 链表 散列(hash)

    万次阅读 2017-02-07 17:39:54
    在我们学习 c 语言基础的的时候, 接触到了 数组链表:我们知道 数组 查找起来 相比较容易一些,但是做 删除和增加的时候比较困难。 数组在内存中是 存储连续一整块的内存。 链表 很容易实现做删除和增加。 ...
  • 数据结构 根据关键字查找 根据索引查找 插入 删除 数组 O(n) O(1) O(n) O(n) 有序数组 O(logn) O(1) O(n) O(n) 链表 O(n) O(n) O(1) O(1) 有序链表 O(n) O(n) O(1) O(1) 双向链表 O(n) O(n) O(1) O(1) ...
  • 数组 VS 链表基础概念数组链表差异对比存储查询添加 & 删除灵活运用数组链表总结 基础概念 数组 数组是一用连续的内存空间存储一组相同数据类型数据的线性数据结构。 链表 链表是一种在内存空间中非连续、非顺序...
  • 数组链表是两种基本的数据结构,他们在内存存储上的表现不一样,所以也有各自的特点 数组 一、数组的特点 1.在内存中,数组是一块连续的区域 2.数组需要预留空间 在使用前需要提前申请所占内存的大小,这样不...
  • 数组链表实现(C语音)

    2018-01-25 00:32:46
    具有数组的快速查找功能,如通过index查找数据节点 能存储任意类型数据 实现接口方法 根据链表和数组常用使用方法,实现一下几种方法:(曾、删、改、查) 实现super_array 结构初始化方法; 实现super_array ...
  • Java 数据结构 数组链表和树的区别解析教程; 一、数组:增删慢,查询快 1.增删慢:数组的长度是固定的,删除一个元素,必须经过以下4步骤。 1.先创建一个新的数组,长度为原来的 -1 2.把 其他的元素复制到新的数组...
  • 数组链表是数据结构的基础,大部分的其他数据结构都是以数组链表为底层结构构件的(比如队列,栈,集合等) 数组数组是将元素在内存中连续存放,每个元素占用的内存相同,可以通过下标迅速访问数组中的任何...
  • 来源:  http://www.cnblogs.com/xdxs/p/4982158.html
  • 哈希表数组链表表示法示例

    千次阅读 2015-01-06 14:25:47
    转自出处:... #include using namespace std; #define MAXSIZE 10//哈希链表 数组个数 当然可以适当的增加或者减少 /* 注意点!!! 1.key值一定不能重复的 2.解决地址冲突法 本例用链表解决冲突即闭
  • 最简单是数据结构就是线性表,包括数组链表、栈和队列。线性表就是数据像线一样连城一条线,线上的每个节点都只有前后两个方向。其他的就是非线性结构,包括树(一个节点可以链接到多个节点)、图(节点可能成环...
  • 数据结构数组链表、堆栈和队列 数据结构数组链表、堆栈和队列 数组 链表 堆栈 队列 数据结构:是指相互之间存在一种或多种特定关系的数据元素的集合。听起来是不是很抽象,简单理解:数据...
  • import sys # 定义链表的数据结构 class ListNode: ...# 将数组转为链表结构 def generate_node(nums): # 定义一个哑节点 p_head = ListNode(-1) temp_head = p_head for num in nums: temp = List

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 299,705
精华内容 119,882
关键字:

结构数组链表