algorithm - 使用最多 3/2n 比较找到数组中两个元素之间的最大差异
问题描述
我正在处理一个带有整数元素的未排序数组,
A={a_1,a_2,...,a_n}
找到数组中两个元素之间的最大差异(在最坏的情况下max|a_i-a_j|)
最多使用3/2n
比较。(运行时无关紧要,我们不能使用诸如 max 或 min 之类的操作)。
我真的怀疑这是否可能:要找到两个元素的最大差异,在最坏的情况下,我们不应该总是需要2n
比较,因为我们需要使用大约 n 个比较来找到数组的最大元素和另一个 n比较以找到数组的最小元素?我不知道在哪里可以削减操作。
我也考虑过分而治之。假设我将这个数组分成 2 个长度为的子数组n/2
,但后来我遇到了同样的问题,因为在每个子数组中找到最大值和最小值并进行n
比较,所以总共会有2n
比较。
关于如何做到这一点的提示将不胜感激。
解决方案
很简单,找到最大差异等于找到数组元素的最小值和最大值。另一方面,您可以通过比较同时找到数组的最小值和最大值3n/2
(所有常见编程语言中的第三种方法,即 C#、C++、Python、C 和 Java):
如果 n 是奇数,则将 min 和 max 初始化为第一个元素。
如果 n 是偶数,则将 min 和 max 分别初始化为前两个元素的最小值和最大值。
对于其余元素,成对挑选它们并将它们的最大值和最小值分别与最大值和最小值进行比较。
比较总数:偶数和奇数 n 不同,见下文:
If n is odd: 3*(n-1)/2 If n is even: 1 Initial comparison for initializing min and max, and 3(n-2)/2 comparisons for rest of the elements = 1 + 3*(n-2)/2 = 3n/2 -2
推荐阅读
- php - PHP 单元测试 - 如何伪造供应商 Guzzle 请求
- android - 删除或更新查询室。安卓
- amazon-web-services - AWS Redshift Spectrum(外部表)-分配给列的 Varchar 数据类型无法同时处理同一列的数组和字符串数据
- javascript - 未捕获的类型错误:无法使用 jQuery 验证读取未定义的属性“调用”
- sql-server - 无法打开用户默认数据库。登录失败 Visual Studio 2019 for SQL Server
- angular - 在 Angular 中,我无法在更长的运行代码完成之前出现加载微调器
- python-3.x - KeyError:当我尝试在 Python Selenium 中使用 execute_script 命令时出现“文档”
- python - Python ODBC 使用服务帐户连接到 SQL Server (trusted_connection=no)
- java - Android Parcel:编写数组列表
- html - 滚动条在 div 中创建空白空间