中位数即是排过序后的处于数组最中间的元素。 不考虑数组长度为偶数的情况。设集合元素个数为n。
简单的想了下:
思路1) 把无序数组排好序,取出中间的元素
时间复杂度 采用普通的比较排序法 O(N*logN)
如果采用非比较的计数排序等方法, 时间复杂度 O(N), 空间复杂度也是O(N).
思路2)
2.1)将前(n+1)/2个元素调整为一个小顶堆,
2.2)对后续的每一个元素,和堆顶比较,如果小于等于堆顶,丢弃之,取下一个元素。 如果大于堆顶,用该元素取代堆顶,调整堆,取下一元素。重复2.2步
2.3) 当遍历完所有元素之后,堆顶即是中位数。
思路3) 熟话说,想让算法跑的更快,用分治!
快速排序之所以得名"快排",绝非浪得虚名!因为快排就是一种分治排序法!
同样,找中位数也可以用快排分治的思想。具体如下:
任意挑一个元素,以改元素为支点,划分集合为两部分,如果左侧集合长度恰为 (n-1)/2,那么支点恰为中位数。如果左侧长度<(n-1)/2, 那么中位点在右侧,反之,中位数在左侧。 进入相应的一侧继续寻找中位点。
这种方法很快,但是在最坏的情况下时间复杂度为O(N^2), 不过平均时间复杂度好像是O(N)。
思路4) 快排的方法存在不确定性,导致其最坏和最好的时候差别很大, 那么有没有一种确定性的方法呢? 答案是有的
貌似算法导论里有讲到. 这里我就先不深究了, 可以参考如下的文章,
O(n)时间快速选择
http://www.shadowxh.com/?p=598
以及本文的别人的评论
引申一:
查找N个元素中的第K个小的元素(来自编程珠玑)
编程珠玑给出了一个时间复杂度O(N),的解决方案。该方案改编自快速排序。
经过快排的一次划分,
1)如果左半部份的长度>K-1,那么这个元素就肯定在左半部份了
2)如果左半部份的长度==K-1,那么当前划分元素就是结果了。
3)如果。。。。。。。<K-1,那么这个元素就肯定在右半部分了。
并且,该方法可以用尾递归实现。效率更高。
时间复杂度分析, 由于差不多每次都是把序列划分为一半。。。假设划分的元素做了随机优化,时间复杂度近似于
N+N/2+N/4.... = 2N*(1-2^-(logN)) 当N较大时 约等于 2N 也就是 O(N)。
看来,快速排需的用处可大着咧。。。
也用来查找可以N个元素中的前K个小的元素,前K个大的元素。。。。等等。
引申二:
查找N个元素中的第K个小的元素,假设内存受限,仅能容下K/4个元素。
分趟查找,
第一趟,用堆方法查找最小的K/4个小的元素,同时记录剩下的N-K/4个元素到外部文件。
第二趟,用堆方法从第一趟筛选出的N-K/4个元素中查找K/4个小的元素,同时记录剩下的N-K/2个元素到外部文件。
。。。
第四趟,用堆方法从第一趟筛选出的N-K/3个元素中查找K/4个小的元素,这是的第K/4小的元素即使所求。
From:
相关推荐
【Python 实现在无序数组中找到中位数的方法】 在Python编程中,寻找无序数组的中位数是一项常见的任务,特别是在数据分析和算法设计中。中位数是将一组数值按大小顺序排列后位于中间位置的数,对于偶数个数值,中...
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例2: nums1 = [1, 2] nums...
1. **掌握线性时间选择的基本算法及其应用:** 线性时间选择算法是一种可以在平均或最坏情况下达到线性时间复杂度的选择算法,它主要用于在无序数组中找到第k小的元素。该算法特别适用于大规模数据集,其核心思想是...
在编程领域,"任意插入一个数,给数组排序"是一个常见的操作,特别是在处理动态数据集时。这个任务涉及两个主要的编程概念:数组管理和排序算法。让我们深入探讨这两个主题。 首先,数组是一种线性数据结构,它存储...
数组中所有其他元素都会出现两次。题目强调了时间复杂度必须为 O(n),空间复杂度应为 O(1)。这里的 n 表示数组 `nums` 的长度。 给出的代码实现中,使用了 `unordered_map` 来存储每个数字及其出现的次数。首先遍历...
- 数据类型:8086是16位处理器,所以可能需要处理的是16位整数,但根据题目描述,数组元素可能是8位的ASCII码表示的数字,需要特别处理。 - 缓冲区管理:内存操作时,需要确保有足够的空间来存储整个数组,并且要...
合并操作则是在两个已排序的数组中,创建一个新的数组来存放这两个数组中的所有元素,且新数组仍然保持排序的顺序。 查询操作通常指的是根据特定的条件在数组中查找元素的位置或者值。此外,数组还能够用于存储大量...
在面试中,面试官可能会进一步询问关于双指针应用的其他问题,比如如何在无序数组中寻找三数之和,或者如何用双指针解决字符串相关问题。这些问题都需要对双指针的原理有深入理解,并能灵活应用。 总之,掌握双指针...
2. **计数过程**:遍历给定的整数数组`i`,对于数组中的每一个元素`index`,将`count[index + 1]`加1。 3. **寻找最大频次**:再次遍历`count`数组,找到最大的计数值`maxCount`及其对应的下标`maxResult`,即为出现...
数组中的每一个元素可以通过其上一行的元素计算得到,这就是递归关系。对于位置`(i, j)`的元素,如果`j > i`或者`j ,则该位置的元素为0;否则,该元素等于上一行位置`(i-1, j)`和`(i-1, j-1)`的元素之和。 5. **...
当您要将无序的无符号整数序列保存到内存中时,使用C编程语言,您可以在4种数据类型中进行选择: uint8_t uint16_t uint32_t uint64_t 如果您的数字在[0,100000]范围内,则每个整数仅需要17位,因为2 17 =...
顺序查找是最基本的查找算法,适用于无序数组。它通过遍历数组中的每个元素来查找目标值,如果找到目标值则返回其位置索引,如果遍历完数组都没有找到则返回-1表示查找失败。顺序查找的时间复杂度为O(n),在数据量...
一种常见的策略是使用快速选择算法找到数组的中位数,然后将所有小于中位数的数放在中位数的左边,大于或等于中位数的数放在右边。这样可以保证数组的一半满足非严格递增,另一半满足非严格递减。然后,我们可以通过...
如果k小于数组长度的一半,那么第k小的元素一定在中位数左侧的子数组中;反之,在右侧。这个方法通常用于并行计算和分布式系统,因为可以将任务有效地分配到多个处理器上。 5. **计数排序法**: 如果数组元素范围...
二分查找时间复杂度题目有序数组中查找某一个数是否存在有序数组中查找大于等于某一个数最左侧的位置一个无序的数组,相邻数一定不相等,求局部最小。// 此时第一位必然
`创建数组,并通过`Random`类生成0到99之间的随机整数填充数组,确保数组处于无序状态。 2. **外层循环**:外层循环控制整个排序过程的轮数。因为每一轮排序都会把当前未排序的最大元素放到正确的位置,所以需要...
本篇文章探讨了一个有趣且实用的计算机科学问题:如何利用快速排序的思想,在线性时间内找出一个无序数组中的第K大元素。这个问题不仅考验着我们对数据结构和算法的理解,还挑战着我们运用已有知识解决新问题的能力...
14. **无序数组的中位数**: - 在一个无序的整数数组中找到中位数,可以使用快速选择或堆。 15. **最长回文子串**: - 找出一个字符串中最长的回文子串,Manacher's algorithm 是一种高效的解决方案。 16. **二...