当前位置: 首页 > news >正文

【数据结构陈越版笔记】2.1 引子【第2章 数据结构实现基础】

2.1 引子

数据结构的处理方法是从具体应用中抽象出共性的数据组织与操作方法,进而采用某种具体的程序涉及语言实现相应的数据存储与操作。
【例】给日常处理的数据进行统计分析
类型名称:统计数据集
数据对象集:N个元素 { x 1 , x 2 , . . . , x N } \{x_{1},x_{2},...,x_{N}\} {x1,x2,...,xN}的集合S
操作集

  1. ElementType Average(S, N):求S中N个元素的平均数;
  2. ElementType Max(S, N):求S中N个元素的最大值;
  3. ElementType Min(S, N):求S中N个元素的最小值;
  4. ElementType Median(S, N):求S中N个元素的中位数,这里的中位数指的是如果将S中的元素按从小到大的顺序依次排列,处在中间位置( ⌈ N / 2 ⌉ \lceil\mathrm{N} / 2\rceil N/2,大于等于N/2的最小整数)的那个元素。

(1)数据存储:对于上述问题,其数据对象是集合S,这也是最简单的一种数据组织方式。今后会有更复杂的组织方式如树和图等。
(2)操作实现:在确定数据的存储方式后,数据结构涉及的另一个问题是相关的操作(运算)如何实现。这些操作的实现需要利用程序涉及语言提供的另一个功能,即流程设计功能。在程序中,我们可以将程序的某个功能设计为函数,这一方面降低了程序设计的复杂性,另一方面也提高了程序设计的重用性。
【代码2.1】Average函数的实现

double Average(int S[], int N)
{int sum = 0;for(int i = 0; i < N; i++){sum+=S[i];}return (double)((double)(Sum))/((double)(N));
}

这个代码简单,不给出运行结果了
而对于中位数Median(S, N)问题则相对比较复杂,设法用一个循环简单地实现,有两种基本的解决思路。
方法1:基于排序,首先将集合S(数组)中的元素从大到小排序,取第 ⌈ N / 2 ⌉ \lceil\mathrm{N} / 2\rceil N/2(大于等于N/2的最小整数)处的元素就是中位数。
方法2:基于问题分解,求集合中位数的问题实际上就是另一个问题的特殊情况,即求集合中的第K大数问题。当 K = ⌈ N / 2 ⌉ K=\lceil\mathrm{N} / 2\rceil K=N/2时,集合的第K大数就是中位数。这个问题当然也可以用排序解决,但还有另一种更巧妙的方法,基本思路是:用一个基准数e将集合S分解为不包含e在内的两个小集合 S 1 S_{1} S1 S 2 S_{2} S2,其中 S 1 S_{1} S1的任何元素均大于等于e, S 2 S_{2} S2的任何元素均小于e,记 ∣ S ∣ |S| S代表集合S元素的个数,这样,如果 ∣ S 1 ∣ ≥ K |S_{1}|\ge K S1K,则说明第K大数在 S 1 S_{1} S1中;如果 ∣ S 1 ∣ |S_{1}| S1恰好等于K-1,说明e是第K大数;否则第K大数在 S 2 S_{2} S2中,并且是 S 2 S_{2} S2中的第 K − ∣ S 1 ∣ − 1 K-|S_{1}|-1 KS11大数。然后,可以用类似的思路继续在 S 1 S_{1} S1 S 2 S_{2} S2中查找,详见【LeetCode215】数组中的第K个最大元素,最后令 K = N / 2 K=N/2 K=N/2即可

相关文章:

  • 使用react-markdown 自定义组件在 Next.js 中进行渲染
  • K8s的资源对象
  • 假装热闹的618!商家被榨干,大主播集体哑火……
  • 136.只出现一次的数字
  • 通过xml配置实现数据动态导入导出Excel
  • 学会python——制作一款天气查询工具(python实例七)
  • 【日记】被客户一顿输出该怎么办(431 字)
  • 【Python机器学习实战】 | 基于决策树的药物研究分类预测
  • STM32项目分享:智慧农业(机智云)系统
  • coco json 改名字 划分验证集
  • Mongodb在UPDATE操作中使用$push向数组中插入数据
  • 简单介绍vim
  • PostgreSQL查看表的大小
  • 性能工具之 JMeter 常用组件介绍(八)
  • Python3发送邮件如何添加附件?怎么配置?
  • 【剑指offer】让抽象问题具体化
  • Android开源项目规范总结
  • canvas 五子棋游戏
  • co.js - 让异步代码同步化
  • cookie和session
  • CSS实用技巧
  • Flannel解读
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Promise初体验
  • Service Worker
  • vue 配置sass、scss全局变量
  • 彻底搞懂浏览器Event-loop
  • 什么是Javascript函数节流?
  • 一个项目push到多个远程Git仓库
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 我们雇佣了一只大猴子...
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​渐进式Web应用PWA的未来
  • #if 1...#endif
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (js)循环条件满足时终止循环
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (pojstep1.1.2)2654(直叙式模拟)
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (ZT)出版业改革:该死的死,该生的生
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)Sql Server 保留几位小数的两种做法
  • .config、Kconfig、***_defconfig之间的关系和工作原理
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .Net 6.0 Windows平台如何判断当前电脑是否联网
  • .Net 8.0 新的变化
  • .net core + vue 搭建前后端分离的框架
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .net refrector
  • .NET 材料检测系统崩溃分析