【数据结构陈越版笔记】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函数的实现

c 复制代码
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 ∣S1∣≥K,则说明第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 K−∣S1∣−1大数。然后,可以用类似的思路继续在 S 1 S_{1} S1或 S 2 S_{2} S2中查找,详见【LeetCode215】数组中的第K个最大元素,最后令 K = N / 2 K=N/2 K=N/2即可

相关推荐
李老师讲编程7 分钟前
C++信息学奥赛练习题-杨辉三角
数据结构·c++·算法·青少年编程·信息学奥赛
期末考复习中,蓝桥杯都没时间学了19 分钟前
力扣刷题13
数据结构·算法·leetcode
多米Domi01140 分钟前
0x3f 第48天 面向实习的八股背诵第五天 + 堆一题 背了JUC的题,java.util.Concurrency
开发语言·数据结构·python·算法·leetcode·面试
深蓝海拓1 小时前
PySide6从0开始学习的笔记(二十六) 重写Qt窗口对象的事件(QEvent)处理方法
笔记·python·qt·学习·pyqt
中屹指纹浏览器1 小时前
中屹指纹浏览器多场景技术适配与接口封装实践
经验分享·笔记
故以往之不谏1 小时前
函数--值传递
开发语言·数据结构·c++·算法·学习方法
向哆哆2 小时前
构建跨端健身俱乐部管理系统:Flutter × OpenHarmony 的数据结构与设计解析
数据结构·flutter·鸿蒙·openharmony·开源鸿蒙
BugShare3 小时前
Obsidian 使用指南:从零开始搭建你的个人知识库
笔记·obsidian
独自破碎E3 小时前
【总和拆分 + 双变量遍历】LCR_012_寻找数组的中心下标
数据结构·算法
深蓝海拓3 小时前
PySide6从0开始学习的笔记(二十五) Qt窗口对象的生命周期和及时销毁
笔记·python·qt·学习·pyqt