数据结构之集合的顺序存储结构https://www.jianshu.com/p/f8a7d52787eb

本文深入讲解了数据结构中的集合结构,探讨了集合的定义、特点及其抽象数据类型。介绍了集合的顺序存储结构,分析了其优缺点,展示了Java实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合的定义

昨天我们聊了 数据结构的由来与分类 ,根据数据之间关系的不同,我们把数据结构分为了四类逻辑结构,其中第一类就是集合结构。今天我们就来详细的讲一下集合结构。

集合是数据逻辑结构中的一种,它是由一个或者多个没有任何关系的数据元素聚集而成,集合中各个数据元素之间不存在任何逻辑依赖关系。跟数学中的集合一样,集合中不会有相同的数据元素。

下图可是个集合示意图(各个美女都处在同一个篮子里,但是他们之间没有任何关系哦),你get到了吗?


集合的抽象数据类型

要想从与语言无关的层次描述集合,那就是抽象数据类型,抽象数据类型包括数据和操作两部分,数据部分为集合,可以用任何一种存储方式存储,比如昨天讲的顺序存储结构和链式存储结构,这两种存储结构我们都会讲到。操作部分是对集合的各种运算,包括插入元素、删除元素、查找元素等等。

集合的抽象数据类型定义如下:

ADT Set is

  Data:

        采用任何一种存储方法存储的一个集合

    Operation:

      initSet() //初始化集合

      add(obj)//添加元素

      remove(obj)//删除元素

      find(obj)//查找元素并返回

      value(i)//返回集合中第i个元素的值

      contains(obj)//集合中是否包含某个元素

      size()//获取集合的长度

      isEmpty//判断集合是否为空

      clear()//清空集合

      output()//输出集合中的所有值

      union(set)//求两个集合的并集

      intersection(set) //求两个集合的交集

 


集合的顺序存储结构和操作实现

集合的顺序存储要求地址空间是连续的,地址必须一个接一个,不能中断。如下图为顺序存储结构:

 

顺序存储结构

顺序存储的每个节点只包含数据部分,不需要额外包含数据之间的关系,因为数据之间的关系通过地址连续来体现,所以非常省空间(这点好处对于集合来说无所谓,因为集合元素之间没有关系,所以集合之间的元素可以随便放入顺序存储结构中。但是对于有序的线性结构来说就有好处了,线性表后面说。)

它的优点访问非常快速,因为地址是连续的,只要知道首地址,任意一个元素的地址都可以算出来。假设每个地址占c个空间,则第i个地址为(i-1)*c。

它的缺点是在插入和删除数据时,可能要移动许多数据,比如一个10000个元素的有序数据,如果我删除了第二个元素,为了继续保持地址连续,所以要把后面9999个元素都向前移动。

但是对于集合来说,插入和删除不需要移动很多元素,只要移动一个元素就行了,因为集合本就是无序的,假入我删除了10000个元素的第二个元素,为了保持地址连续,我只要把最后一个元素移动到已删除的第二个元素的位置上就行了。

我用Java实现集合的顺序存储结构,根据上面的抽象数据类型的操作,首先定义一个接口Set,包含集合的各种操作,然后让子类实现该接口,覆写各种操作方法,并且子类用数组来存储数据部分

Set接口


集合的顺序存储结和构操作实现如下图代码,详细说明都在注释里面

SequenceSet类


其中对于插入、删除、查找元素、contains、输出集合的每个元素等操作都是O(n)的时间复杂度,

对于获取第i个元素、初始化集合、获取集合长度、集合判空、清空集合的时间复杂度都是O(1)的。

对于求并集和交集的时间复杂度都是O(m*n),m、n分别代表两个集合的长度。

测试类:

 


马上就要凌晨一点半了!!!明天还要上班!一不小心就写了两三个小时了,别看内容不多,代码可都是一个个码的,码完经过测试才敢发出来,今晚就聊到这里了,集合的顺序存储结构比较简单,明天接着聊集合的链式存储结构,欢迎大家吐槽关注,谢谢



作者:理想是一盏灯
链接:https://www.jianshu.com/p/f8a7d52787eb
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

要获取简书上的特定文章 `b28e73eefa88` 的内容,可以通过解析网页结构来提取所需的信息。根据已知的引用描述[^1],目标数据位于 `<li>` 标签下的子元素中,具体来说: - **标题** 和 **链接** 存在于 `<a>` 标签下。 - **摘要** 则存储于 `<p>` 标签。 以下是实现这一功能的一个 Python 脚本示例,它利用 Selenium 来模拟浏览器行为并抓取指定文章的数据: ### 使用 Selenium 抓取简书文章 ```python from selenium import webdriver from selenium.webdriver.common.by import By # 初始化 WebDriver (需确保本地安装有对应版本的驱动程序) browser = webdriver.Chrome() try: # 打开目标页面 article_url = f"https://www.jianshu.com/p/b28e73eefa88" browser.get(article_url) # 提取标题、摘要和链接 title_element = browser.find_element(By.TAG_NAME, "h1") abstract_element = browser.find_element(By.CLASS_NAME, "abstract") link_element = browser.current_url # 输出结果 print(f"Title: {title_element.text} [{link_element}]") print(f"Abstract: {abstract_element.text}") finally: # 关闭浏览器实例 browser.quit() ``` 上述脚本通过定位 HTML 文档中的关键标签实现了对文章基本信息的捕获。需要注意的是,在实际运行前应确认环境配置无误(如 ChromeDriver 版本匹配),并且考虑到反爬机制的存在可能需要额外处理动态加载的内容或其他防护措施[^2]。 #### 数据保存至文件 如果希望将这些信息记录到外部 `.txt` 文件以便后续查阅,则可以扩展如下代码片段所示的方式完成操作: ```python with open("article_jianshu_b28e73eefa88.txt", "w", encoding="utf-8") as file: file.write(f"{title_element.text}\n{abstract_element.text}\n{link_element}") ``` 此部分逻辑基于先前提到的方法论进一步封装成可重复使用的模块化单元。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值