精华内容
下载资源
问答
  • 数据结构集合

    千次阅读 2014-02-11 13:27:09
    直接存储结构的优点是:向数据结构中添加元素是很高效的,只要直接放在数据末尾的第一个空位上就可以了。它的缺点是:向集合插入元素将会变得低效,它需要给插入的元素腾出位置并顺序移动后面的元素。


    线性集合按存储方式,又分为直接存储和顺序存储。所谓直接存储是指:该类型的集合数据元素可以直接通过下标(也即index)来访问,在C#中有三种形式:Array(包括数组和List<T>),string,struct。直接存储结构的优点是:向数据结构中添加元素是很高效的,只要直接放在数据末尾的第一个空位上就可以了。它的缺点是:向集合插入元素将会变得低效,它需要给插入的元素腾出位置并顺序移动后面的元素。

    string和structs虽然是直接存储结构,但它们与一般的集合定义有很大的不同,所以也不在本建议讨论之中。在直接存储的数据结构中,需要区分的是数组和List<T>的选择。再次强调一下:如果集合的数目固定并且不涉及到转型,使用数组效率高,否则就使用List<T>。

    顺序存储结构,也即线性表。线性表的大小可动态的扩大和缩小,它在一片连续的区域中存储数据元素。线性表不能按照索引进行查找,它通过对地址的引用来搜索元素,为了找到某个元素,它必须遍历所有元素,直到找到对应的元素为止。所以线性表的优点是插入和删除数据效率高,而缺点是查找的效率相对来说低一些。

    线性表又可以分为队列、栈以及索引群集,在C#中,分别表现为:Queue<T>,Stack<T>,索引群集又进一步泛化为字典类型Dictionary< TKey, TValue >和双向链表LinkedList<T>。

    队列Queue<T>遵循的是先入先出模式,它在集合末尾添加元素,在集合起始删除元素,如图:

    image

    队列操作

    根据队列的特点,可以用来处理并发命令等场景:将所有客户端的命令先入队,由专门的工作线程来执行队列的命令。在分布式中的消息队列就是一个典型的队列应用实例。

    栈Stack<T>遵循的是后入先出模式,它在集合末尾添加元素,同时也在集合末尾删除元素,如图2-3:

    image

    栈操作

    字典Dictionary<TKey, TValue>存储的是键值对,值在基于键的散列码的基础上进行存储。字典类对象由包含集合元素的存储桶组成,每一存储桶与基于该元素的键的哈希值关联。如果需要根据键进行值的查找,使用Dictionary<TKey, TValue>将会使搜索和检索更会快捷。

    双向链表LinkedList<T>是一个类型为LinkedListNode的元素对象的集合。当我们在集合中觉得插入和删除数据很慢的时候,我们可以考虑使用链表。如果我们使用LinkedList<T>,我们会发现此类型并没有其它集合普遍具有的Add方法,取而代之的是AddAfter、AddBefore、AddFirst、AddLast等方法。双向链表中的每个节点都向前指向Previous节点,向后指向Next节点。

    以上讨论了线性集合,在FCL中,非线性集合实现的不多。非线性集合分为层次集合和组集合。层次集合,如树,在FCL中就没有实现。组集合,又分为集和图。集在FCL中实现为HashSet<T>,而图在FCL中也没有对应实现。集的概念在本意上是指存放在集合中的元素是无序的且不能重复的。下图演示了集的用途:

    image

    集操作

    除了上面我们提到的集合类型,还有其他几个要掌握的集合类型,它们是在实际应用中发展出来的对以上基础类型的扩展:SortedList<T>,SortedDictionary<TKey, TValue>,SortedSet<T>。它们所扩展的对应类为List<T>,Dictionary<TKey,TValue>,HashSet<T>,作用是将原本无序排列的元素,变为有序排列。

    除了排序上的需求增加了上面3个集合类,在命名空间System.Collections.Concurrent下,还涉及几个多线程集合类。它们主要是:ConcurrentBag<T>对应List<T>,ConcurrentDictionary<TKey, TValue>对应Dictionary<TKey, TValue>,ConcurrentQueue<T>对应Queue<T>,ConcurrentStack<T>对应Stack<T>。如果我们的集合被用于多线程应用中,可以使用这几个集合类型。关于集合的线程安全性,可以进一步查看MSDN。

    本建议到此为止已经介绍了FCL中的大部分泛型集合类,为了对它们有更好的了解,最后我们给出一个主要集合类的类图。实际工作中,应该根据需要选择合适的集合类。

    
    展开全文
  • 内置数据结构集合和字典

    千次阅读 2020-10-01 13:21:19
    集合(无序不重复数列) 集合的创建 使用大括号 { } 或者 set() 函数创建集合; 注意: 创建一个空集合必须用 set() 而不是 { } { } 是用来创建一个空字典。 示例: 对集合内容的添加 add() 添加单个元素 ...

    集合(无序不重复数列)

    集合的创建

    • 使用大括号 { } 或者 set() 函数创建集合;
    • 注意:
      1. 创建一个空集合必须用 set() 而不是 { }
      2. { } 是用来创建一个空字典。
    • 示例:在这里插入图片描述

    对集合内容的添加

    • add() 添加单个元素
    • update() 添加多个元素
    • 示例在这里插入图片描述

    对集合的内容进行删除

    • remove() 移除集合内的指定元素
    • pop() 随机移除集合内的某个元素
    • clear() 移除集合中的所有元素
    • 示例:
      在这里插入图片描述
    • 对两个集合求交集和并集
    • & 交集
    • | 并集
    • 示例  注:不支持重复和连接,也不支持索引和切片,支持成员操作符和for循环

    字典(由多个key-value键值对组成的数据集)

    特性:不支持重复和连接,也不支持索引和切片,支持成员操作符和for循环

    字典的创建

    • 空字典 {}
    • 书写格式
      {key1:value, key2:value2, …}
      字典生成式:d = {i:i.upper() for i in 'abcde'}
    • 示例在这里插入图片描述

    对字典内容的更新或者添加

    • d[key]='value' 直接对字典里的指定Key更新, 如果key不存在则会添加该键值对
    • update() 对字典中的多个键值对进行操作
    • 示例在这里插入图片描述

    对字典内容的查看

    • keys()查看字典中所有的key值
    • values()查看字典中所有的value值
    • items()查看字典中所有的键值对
    • d['key']查看字典中指定Key值对应的value值
    • 示例
      在这里插入图片描述

    对字典内容删除

    • pop(key) 对指定的key值删除,会返回删除的key值
    • clear() 将字典清空
    • 示例在这里插入图片描述

    实例

    1. 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从大到小排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理)。

      代码:

      import random
      N = int(input('随机生成数的个数:'))
      item = [random.randint(1, 1000) for i in range(N)]
      item = set(item)
      item = sorted(item)
      print(item[::-1]# 用切片的方法实现降序,也可以用sorted函数实现降序item = sorted(item, reverse=True)
      

      测试:在这里插入图片描述

    2. 写一个函数wordcount统计一篇文章的每个单词出现的次数(词频统计)。统计完成后,对该统计按单词频次进行排序。
      代码

       Word = input('WORD:')
      Word_sum = {}
      for i in Word.split():
          if i in Word_sum:
              Word_sum[i] += 1     # 通过key获得对应的values
          else:
              Word_sum.update({i: 1})
      else:
          print(Word_sum)

      测试:
      在这里插入图片描述

    展开全文
  • 数据结构集合

    万次阅读 2020-09-08 22:57:44
    数据结构集合

    数据结构之集合

    展开全文
  • 数据结构:八大数据结构分类

    万次阅读 多人点赞 2018-09-05 18:23:28
    数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。 常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如图所示: 每一种数据结构都有着独特的数据...

    本文目录:

    数据结构分类

    数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。
    常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如图所示:
    这里写图片描述
    每一种数据结构都有着独特的数据存储方式,下面为大家介绍它们的结构和优缺点。

    1、数组

    数组是可以再内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从0开始。例如下面这段代码就是将数组的第一个元素赋值为 1。

    int[] data = new int[100];data[0]  = 1;
    

    优点:
    1、按照索引查询元素速度快
    2、按照索引遍历数组方便

    缺点:
    1、数组的大小固定后就无法扩容了
    2、数组只能存储一种类型的数据
    3、添加,删除的操作慢,因为要移动其他的元素。

    适用场景:
    频繁查询,对存储空间要求不大,很少增加和删除的情况。

    2、栈

    栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。
    这里写图片描述
    栈的结构就像一个集装箱,越先放进去的东西越晚才能拿出来,所以,栈常应用于实现递归功能方面的场景,例如斐波那契数列。

    3、队列

    队列与栈一样,也是一种线性表,不同的是,队列可以在一端添加元素,在另一端取出元素,也就是:先进先出。从一端放入元素的操作称为入队,取出元素为出队,示例图如下:
    这里写图片描述
    使用场景:因为队列先进先出的特点,在多线程阻塞队列管理中非常适用。

    4、链表

    链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间),另一个是指向下一个结点地址的指针域。根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。
    这里写图片描述
    链表的优点:
    链表是很常用的一种数据结构,不需要初始化容量,可以任意加减元素;
    添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加,删除很快;

    缺点:
    因为含有大量的指针域,占用空间较大;
    查找元素需要遍历链表来查找,非常耗时。

    适用场景:
    数据量较小,需要频繁增加,删除操作的场景

    5、树

    是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做 “树” 是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

    • 每个节点有零个或多个子节点;
    • 没有父节点的节点称为根节点;
    • 每一个非根节点有且只有一个父节点;
    • 除了根节点外,每个子节点可以分为多个不相交的子树;

    在日常的应用中,我们讨论和用的更多的是树的其中一种结构,就是二叉树
    这里写图片描述
    二叉树是树的特殊一种,具有如下特点:

    1、每个结点最多有两颗子树,结点的度最大为2。
    2、左子树和右子树是有顺序的,次序不能颠倒。
    3、即使某结点只有一个子树,也要区分左右子树。

    二叉树是一种比较有用的折中方案,它添加,删除元素都很快,并且在查找方面也有很多的算法优化,所以,二叉树既有链表的好处,也有数组的好处,是两者的优化方案,在处理大批量的动态数据方面非常有用。

    扩展:
    二叉树有很多扩展的数据结构,包括平衡二叉树、红黑树、B+树等,这些数据结构二叉树的基础上衍生了很多的功能,在实际应用中广泛用到,例如mysql的数据库索引结构用的就是B+树,还有HashMap的底层源码中用到了红黑树。这些二叉树的功能强大,但算法上比较复杂,想学习的话还是需要花时间去深入的。

    6、散列表

    散列表,也叫哈希表,是根据关键码和值 (key和value) 直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。

    记录的存储位置=f(key)

    这里的对应关系 f 成为散列函数,又称为哈希 (hash函数),而散列表就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里,这种存储空间可以充分利用数组的查找优势来查找元素,所以查找的速度很快。

    哈希表在应用中也是比较常见的,就如Java中有些集合类就是借鉴了哈希原理构造的,例如HashMap,HashTable等,利用hash表的优势,对于集合的查找元素时非常方便的,然而,因为哈希表是基于数组衍生的数据结构,在添加删除元素方面是比较慢的,所以很多时候需要用到一种数组链表来做,也就是拉链法。拉链法是数组结合链表的一种结构,较早前的hashMap底层的存储就是采用这种结构,直到jdk1.8之后才换成了数组加红黑树的结构,其示例图如下:
    这里写图片描述
    从图中可以看出,左边很明显是个数组,数组的每个成员包括一个指针,指向一个链表的头,当然这个链表可能为空,也可能元素很多。我们根据元素的一些特征把元素分配到不同的链表中去,也是根据这些特征,找到正确的链表,再从链表中找出这个元素。

    哈希表的应用场景很多,当然也有很多问题要考虑,比如哈希冲突的问题,如果处理的不好会浪费大量的时间,导致应用崩溃。

    7、堆

    堆是一种比较特殊的数据结构,可以被看做一棵树的数组对象,具有以下的性质:

    • 堆中某个节点的值总是不大于或不小于其父节点的值;

    • 堆总是一棵完全二叉树。

    将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。

    堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。
    (ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4…n/2),满足前者的表达式的成为小顶堆,满足后者表达式的为大顶堆,这两者的结构图可以用完全二叉树排列出来,示例图如下:
    这里写图片描述
    因为堆有序的特点,一般用来做数组中的排序,称为堆排序。

    8、图

    图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。

    按照顶点指向的方向可分为无向图和有向图:
    这里写图片描述
    这里写图片描述
    图是一种比较复杂的数据结构,在存储数据上有着比较复杂和高效的算法,分别有邻接矩阵 、邻接表、十字链表、邻接多重表、边集数组等存储结构,这里不做展开,读者有兴趣可以自己学习深入。

    展开全文
  • JavaScript数据结构-集合

    千次阅读 2016-11-06 15:41:57
    集合(set)是一种包含不同元素的数据结构集合中的元素称为成员。集合具有两个重要特性: (1)集合中的成员是无序的 (2)集合中不允许相同成员存在 当想创建一个数据结构,用来保存一些独一无二的元素时,...
  • JavaScript数据结构——集合JavaScript数据结构集合)封装集合集合常见的操作JavaScript代码实现封装集合基本方法实现多个集合操作测试代码 JavaScript数据结构集合集合通常是由一组无序的、不能重复的元素...
  • 数据结构-集合

    千次阅读 2019-05-06 17:21:36
    假设利用两个线性表LA和LB分别表示两个集合A和B(即:线性表中的数据元素即为集合中的成员),现要求一个新的集合A=A∪B。这就要求对线性表做如下操作:扩大线性表LA,将存在于线性表LB中而不存在于线性表LA中的数据...
  • 数据结构集合

    千次阅读 2019-04-26 16:28:58
    写在前边:本文是个人学习笔记。...List集合 集合初始化 数组集合 集合与泛型 元素的比较: JDK中使用的排序方法TimSort hashCode 和equals fail-fast机制 Map类集合: 关于树: 平衡二...
  • Java 数据结构集合

    千次阅读 2018-11-15 23:01:22
    List 集合是线性数据结构的主要实现,List 集合的遍历结果是稳定的。该体系最常用的是 ArrayList 和 LinkedList。 ArrayList 是容量可以改变的非线程安全集合。内部实现使用数组进行存储,集合扩容时会创建更大的...
  • 集合这个概念应该大家在学习数学的时候都听过并且有学习过,它也是一种数据结构,我们还是需要用代码来实现集合的很多方法。 学习过ES6语法的小伙伴应该知道,ES6新增了一种 Set 数据结构,这就是集合,尽管官方已经...
  • List集合&数据结构

    千次阅读 2020-06-16 14:09:21
    1.1集合的体系结构 集合类的特点 提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变 集合类的体系 1.2Collection集合概述和基本使用 Collection集合概述 是单例集合的顶层接口,他表示一组对象,...
  • 数据结构——集合合并

    千次阅读 2014-08-07 11:10:23
    数据结构-集合合并 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte 描述 假设利用两个线性表LA和LB分别表示两个集合A和B(即线性表中的数据元素即为集合中的成员),现要求一个新的集合A=A∪B。这...
  • 题目:设计并实现一个集合数据结构Set。一个集合中没有重复元素,支持下列运算: boolean add(E o) 如果 set 中尚未存在指定的元素o,则添加此元素。 boolean addAll(Set c) 如果 set 中没有指定集合c中的...
  • java数据结构了解与集合学习

    千次阅读 2020-08-04 20:36:23
    学习集合前需要了解数据结构基础。 数据结构 数据结构是指逻辑意义上的数据组织方式及其相应的处理方式。 逻辑意义:数据结构的抽象表达非常丰富,而实际物理存储方式相对单一。比如:二叉树结构,在物理上可能也...
  • 数据结构-JS实现集合

    千次阅读 2021-03-08 17:20:16
    文章目录一、什么是集合?1.1 集合的常见方法 一、什么是集合? 1.1 集合的常见方法
  • 数据结构集合及运算

    千次阅读 2019-08-24 18:02:30
    可以用树结构表示集合,树的每个结点代表一个集合元素 采用数组存储形式 集合运算 (1)查找某个元素所在的集合(用根结点表示) int Find( SetType S[ ], ElementType X ) { /* 在数组S中查找值为X的元素所属的...
  • Java集合数据结构

    千次阅读 2015-08-03 07:21:26
    集合类型 Set集合集合元素是不能重复的。元素是没有顺序的。所以它不能基于位置访问元素。TreeSet和HashSet是它的实现类。 List集合集合元素是可以重复的。元素是有顺序的。所以它可以基于位置访问元素。...
  • 集合中常用数据结构总结

    千次阅读 2019-04-28 20:17:49
    常见的和集合相关的数据结构有: 数组, 栈, 队列,链表,哈希表, 二叉树 下面简单总结一下个数据结构特点: 1. 数组 ArrayList(public class ArrayList extends AbstractList implements List, RandomAccess, ...
  • typedef struct zskiplistNode { //节点对应成员的对象,一般是SDS robj *obj; //分数,跳跃表的顺序按照分值进行排列 double score; //存储后继节点的指针 struct zskiplistNode *backward;...
  • 数据结构数据结构描述

    千次阅读 2019-05-10 22:49:12
    数据结构及其分类 典型数据结构 集合:其数据元素之间没有需要关注的明确关系,之是把一组数据元素包装成为一个整体。 序列:其数据元素之间有一种明确的先后关系(是有顺序的)。序列结构及其变形如下,其特点...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 76,165
精华内容 30,466
关键字:

数据结构集合

数据结构 订阅