首页 > 编程语言 >Dotnet算法与数据结构:Hashset, List对比

Dotnet算法与数据结构:Hashset, List对比

时间:2024-07-09 19:53:03浏览次数:6  
标签:HashSet list 复杂度 元素 List 哈希 Dotnet Hashset

  哈希集A 是存储唯一元素的集合。它通过在内部使用哈希表来实现这一点,该哈希表为基本操作(如添加、删除和包含)提供恒定时间平均复杂度 (O(1))。此外,不允许重复元素,使其成为唯一性至关重要的场景的理想选择。另一方面,表示按顺序存储元素的动态数组。它允许重复元素并提供对元素的索引访问,使其适用于需要具有重复项的有序集合的方案。但是,在 a 中添加、删除和包含等操作的时间复杂度为 O(n),其中 n 是列表中的元素数。性能注意事项会员资格检查和 之间的主要区别之一在于它们在成员资格检查方面的性能。

HashSet

A 是存储唯一元素的集合。它通过在内部使用哈希表来实现这一点,该哈希表为基本操作(如添加、删除和包含)提供恒定时间平均复杂度 (O(1))。此外,不允许重复元素,使其成为唯一性至关重要的场景的理想选择。

List

另一方面,表示按顺序存储元素的动态数组。它允许重复元素并提供对元素的索引访问,使其适用于需要具有重复项的有序集合的方案。但是,在 a 中添加、删除和包含等操作的时间复杂度为 O(n),其中 n 是列表中的元素数。

性能注意事项

会员资格检查

和 之间的主要区别之一在于它们在成员资格检查方面的性能。HashSetList

  • HashSet:a 中的成员资格检查在恒定时间复杂度 (O(1)) 下非常有效。这使其成为需要频繁进行存在性检查时的首选。

HashSet<int> hashSet = new HashSet<int>(); hashSet.Add(1); bool contains = hashSet.Contains(1); // O(1) operation
  • List

    :相反,a 需要线性搜索运算 (O(n)) 来检查元素是否存在。这意味着,随着列表大小的增加,成员资格检查所需的时间也会成比例地增加。
List<int> list = new List<int>(); list.Add(1); bool contains = list.Contains(1); // O(n) operation

插入和删除

虽然两者都支持添加和删除元素,但它们的性能特征有很大不同。

  • HashSet:在时间复杂度恒定的情况下,插入和删除通常很快 (O(1))。但是,在极少数情况下,当哈希冲突频繁发生时,性能可能会下降到 O(n)。

HashSet<int> hashSet = new HashSet<int>(); hashSet.Add(1); hashSet.Remove(1); // O(1) operation
  • List

    :在 中,列表末尾的插入和删除速度很快,时间复杂度恒定 (O(1))。但是,列表中间或开头的操作需要移动元素,从而导致线性时间复杂度 (O(n))。
List<int> list = new List<int>(); list.Add(1); list.Remove(1); // O(n) operation

内存开销

另一个需要考虑的方面是内存开销,尤其是在处理大量元素时。

  • HashSet:在内部,a 使用哈希表来存储元素,这会产生哈希桶和哈希代码的额外内存开销。但是,与存储的元素相比,此开销通常可以忽略不计。

  • List

    :A 消耗的内存与存储的元素数成正比。由于它维护一个连续的内存块,因此当列表达到容量时调整列表的大小可能会导致内存重新分配和元素复制,从而导致额外的开销。

选择正确的数据结构

和 之间的选择取决于应用的具体要求:

  • 在以下情况下使用:HashSet

  • 元素的独特性至关重要。

  • 需要快速会员资格检查。

  • 需要有效地插入和删除元素。

  • 在以下情况下使用:List<T>

  • 有重复的有序收集是可以接受的。

  • 对元素的索引访问是必要的。

  • 元素的顺序遍历很常见。

标签:HashSet,list,复杂度,元素,List,哈希,Dotnet,Hashset
From: https://www.cnblogs.com/flamesky/p/18292639

相关文章

  • MyBatisPlus的Mapper.xml入参List执行in函数
    使用情景这个是开发过程中比较常见的情景,入参一个list,在Mapper.xml里面执行sql的in函数,今天来记录下这个问题,希望可以给大家一点帮助启发。Mapper文件解决方案xml文件<selectid="get"resultType="com.vo.tVo">SELECTnameFROMus......
  • Java 中的泛型 集合(List,Set) Map
    泛型集合(List,Set)Map泛型泛型的本质是参数化类型,即允许在编译时对集合进行类型检查,从而避免安全问题,提高代码的复用性泛型的具体定义与作用定义:泛型是一种在编译阶段进行类型检查的机制,它允许在类,方法,接口后通过<>来声明类型参数.这些参数在编译时会被具体的类......
  • day3-linked list-part01-7.5
    tasksfortoday1.链表理论基础2.203.移除链表元素3.707.设计链表4.206.反转链表------------------------------------------------1.链表理论基础单链表:(singly-linkedlist)链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据......
  • day4-linked list-part02-7.6
    taskfortoday1.24.两两交换链表中的节点2.19.删除链表的倒数第N个节点3.面试题02.07.链表相交4.142.环形链表II-------------------------------------------------------------------1.24.两两交换链表中的节点Inthispractice,payattentionto......
  • DataTable 与 泛型集合List<T>相互转换
    List转DataTablepublicstaticDataTableToDataTable<T>(thisList<T>list){DataTableresult=newDataTable();List<PropertyInfo>pList=newList<PropertyInfo>();Typetype=typeof(T);Array......
  • TNS问题排查 The listener supports no services
     检查tns的日志信息查看具体报错详情/u01/app/oracle/diag/tnslsnr/<hostname>/listener/alert/log.xml 修改litener.ora #listener.oraNetworkConfigurationFile:/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora#GeneratedbyOracleco......
  • 【数据结构】—— 单链表(single linked list)
    文章目录1、单链表的定义优点和缺点单链表的构成2、单链表的创建初始化:3、单链表的接口实现打印尾插头插尾删头删查找在指定位置之前插入在指定位置之后插入删除指定位置的节点删除指定位置之后的节点销毁链表4、源代码1、单链表的定义单链表(SinglyLinkedList......
  • List 转 Page
    packagecom.leo.boot.jpa.stream;importorg.apache.commons.collections4.CollectionUtils;importorg.apache.commons.collections4.IterableUtils;importorg.springframework.beans.BeanUtils;importorg.springframework.data.domain.Page;importorg.springfram......
  • List 按照指定大小分片的几种方式
    如果有一个list<string>里面可能有1000份或者更多数据,如果需要进行入库等操作,需要拆分成指定大小每份进行处理,这种需求很常见,那么应该怎么做呢?首先我们需要将List<String> 转为多份后进行逐个处理, 处理批量事务注意事务哦 那么怎么将list转为多份呢? 下面介绍2......
  • dotnet WinUI3 Win2D 翻转图片
    本文将告诉大家如何在WinUI3里面使用Win2D进行图片的翻转,本文的方法也适用于UWP框架图片的翻转在Win2D里面,可以使用Transform2DEffect特效来辅助实现,核心逻辑就是通过缩放矩阵当成2D翻转矩阵,将缩放的X和Y传入负数即可分别实现对应方向的翻转。比如左右水平翻转可将......