`
rys5851968
  • 浏览: 155801 次
社区版块
存档分类
最新评论

算法设计:从一个很大很大的数组里找前N个最大数的思路之一

 
阅读更多
这里先讲一种类似于快速排序的方法。注意题目要求,不要求完全排序,只要求最快解决问题!这个题是我面试NI公司时,对方问我的。原话是从1亿个数据里,找出前一百个最大的。

首先看源码吧:

void main(int a[], int start, int end, int N)//从数组a里,找出前N个最大的。如果是a[100],则start = 0, end = 99.注意这个索 引问题

{
int mid = (start + end)/2;

int i = start, j = end;

while(i<j)

{
while(i<j && a[i]<=a[mid])

i++;

while(i<j && a[j]>=a[mid])

j--;

swap(a[i], a[j]);

}
/*注意这个while出来之后,i一定是等于j的,且从i 到 end是较大的那一端*/

if(end-i+1 == N)

return;

if(end - i+1 > N)

findMaxN(a, i, end, N);

else

findMaxN(a, start, i, N - (end -i +1));

}
再来详细说说思路,如果您看懂了快速排序对此一定不会陌生。首先拿a[mid] 做基准值,然后让i, j从两端开始遍历,如果索引小的那一端数据小于基准值a[mid], 就往前遍历,如果 左边的大于了a[mid], while循环会跳出,记住这时的a[i] 是大于a[mid],

然后类似的思路,从j那一端遍历,当右边的数据a[j ] 小于基准值a[mid],则小while循环会跳出。然后会运行swap()这个函数,将两个值进行交换 。 这样最外面的while循环出来之后,i一定是等于j的,注意这里i 和j不一定等于当前域中的mid。而且从i到end都是较大的,然后看看较大的那一端的数据有多少个,然后进行遍历。

如果已经等于要找的N个,则跳出函数。如果大于N,则要从i到end为区间内接着找;如果小于N,比如说要找前50个最大的,结果end-i+1才等于20,也就是从i到end有20个较大的数,这就需要从 start(第一次时,可以认为是0)到i 区间内再找50-20 = 30个最大的。

至于swap的函数,利用引用实现如下:

void swap(int &a, int &b)

{

int temp = a;

a = b;

b= temp;}

最后说说,如果这个函数执行完毕了,我怎么访问找到的最大的N个数呢? 很简单,假设数组长度为n, 从a[n-1], a[n-2]。。。顺序取N个数,就是找到的最大的前N个数据了!这个算法的最大情况时间复杂度是o(n的平方),最好情况是o(n), 平坦下来也是o(n).

等我空我介绍第二种思路,上面代码是即兴写的,源码我一会上传。
http://download.csdn.net/detail/yanzi1225627/4684046
分享到:
评论

相关推荐

    典型的Top K算法 找出一个数组里面前K个最大数.doc

    典型的Top K算法 找出一个数组里面前K个最大数 Top K算法是解决一个经典的问题,即在一个大规模的数组中找到前K个最大数的问题。在这个问题中,我们需要在一个数组中找到前K个最大数,例如在搜索引擎中,需要找出最...

    用递归算法编写求一个数组A中的最大元素

    通过上述分析可以看出,递归算法在解决数组最大值问题时具有很好的实用性和可读性。虽然递归算法存在一定的局限性,但在处理相对较小的数据集时,其简洁性和直观性使其成为一种非常有用的技术手段。

    分治算法-求一个数组中的最大值和最小值

    通过分治算法来求解一个数组中的最大值和最小值,不仅可以有效地降低问题的复杂度,还能充分利用计算机的处理能力。此外,这种方法还具有很好的可扩展性和并行处理潜力,非常适合于处理大规模数据集。

    数据结构(JAVA) 将含有n个整数元素的数组a0..n-1循环右移m位,要求算法的空间复杂度为O(1)

    这是一个典型的问题,它涉及到数组的操作和算法的设计。在这个问题中,我们需要确保算法的空间复杂度为O(1),这意味着我们不能使用额外的大规模存储空间,只能在原数组上进行操作。 首先,我们要理解循环右移的概念...

    求一个含有8个整数的数组中前3个最大值对应的下标

    选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。在这个问题中,我们不需要完全排序,只需要找出...

    【源代码】C++算法(五)一维数组去重(复杂度为n且不新开辟空间)

    在链表中,可以使用两个指针分别指向当前元素和前一个元素,以检查重复。在哈希表中,可以利用其快速查找特性来检测元素是否已经存在,但这会增加空间复杂度,不再满足原题要求。 总结一下,本篇C++算法的核心思想...

    用matlab如何求出一个数组中最接近某个数的五个数

    在MATLAB中,寻找一个数组中最接近特定数值的五个数是一项常见的操作,特别是在数据分析和算法设计中。这个任务可以通过排序和索引技巧来实现。以下是一个详细的步骤解释: 首先,我们需要一个包含多个数值的数组,...

    编写程序,找出一个二维数组的鞍点,即在当前行最大,当前列最小的元素,也可能没有鞍点。

    例如,一个大小为m×n的二维数组可以表示为一个长度为m*n的一维数组,通过下标i * n + j来获取第i行第j列的元素。 接下来,我们讨论如何找到二维数组的鞍点。以下是一个可能的算法步骤: 1. 初始化:设置两个变量...

    算法-数组排序 按数组内数字大小排序 取得最大值或最小值.rar

    本压缩包文件"算法-数组排序 按数组内数字大小排序 取得最大值或最小值.rar"包含的内容很可能是关于如何实现数组排序以及如何高效地获取数组中的最大值和最小值的详细讲解。 一、排序算法概述 排序算法是用于重新...

    面试之大数找关键值(如从10亿个浮点数中找出最大的1万个)

    首先,我们可以想到的方法是建立一个数组把1亿个数装起来,然后用for循环遍历这个数组,找出最大的1万个数来。这种方法的时间复杂度为O(n*m),其中n是数组的大小,m是要找出的最大数的个数。然而,这种方法的运行...

    4-14_lv一维数组中所有元素之和_

    计算一维数组中所有元素之和的基本算法非常简单:初始化一个变量(初始值通常为零),然后遍历数组中的每一个元素,将当前元素的值加到变量上。当遍历完整个数组后,变量的值即为所有元素的总和。 三、LV中的数组...

    yy.rar_数组 最大

    4. **复杂度分析**:讨论算法的时间复杂度和空间复杂度,比如,一个简单的线性遍历算法的时间复杂度是O(n),其中n是数组长度。 5. **边界条件**:指出处理空数组或只有一个元素的特殊情况。 6. **优化方案**:如果...

    最大子数组乘积

    这个问题要求我们从一个整数数组中找到连续子数组,使得这个子数组的所有元素乘积最大。这个问题不仅出现在面试中,也是数据分析和算法设计的重要实践。 首先,我们需要理解问题的关键点:数组可以包含正数、负数...

    力扣算法题:和为K的子数组的官方测试用超长数组,长度为20000

    2. **动态规划**:虽然动态规划可以解决某些子问题,但在这个问题上,由于我们需要找到所有和为K的子数组,而不仅仅是最大或最小的一个,动态规划的优势并不明显。因此,通常不会选择这种方法。 3. **滑动窗口**:...

    算法-数组逆序重存放(信息学奥赛一本通-T1105).rar

    标题中的“算法-数组逆序重存放”是一个典型的编程问题,常见于信息学奥赛,如NOIP(全国青少年信息学奥林匹克联赛)等竞赛中。这个问题的核心是要求参赛者实现一个算法,能够将给定的数组按照逆序的方式重新排列。...

    计算大数N的阶乘,N可以任意大,只需修改数组的大小即可。

    在编程领域,尤其是在数学计算和算法设计中,计算大数的阶乘是一个常见的挑战。本文将深入探讨如何使用C语言来解决这个问题,特别是在处理大数时如何避开计算机字长的限制,实现高精度的计算。 阶乘是一个数学概念...

    任意插入一个数,给数组排序

    在编程领域,"任意插入一个数,给数组排序"是一个常见的操作,特别是在处理动态数据集时。这个任务涉及两个主要的编程概念:数组管理和排序算法。让我们深入探讨这两个主题。 首先,数组是一种线性数据结构,它存储...

    数据结构与算法 一维数组-二维数组-三维数组

    一维数组是最基础的数据结构之一,它是一个有序的元素集合,每个元素都可以通过一个唯一的索引来访问。在C++中,一维数组可以这样定义: ```cpp int oneDimArray[10]; // 定义一个包含10个整数的一维数组 ``` 数组...

    N选M的所有组合(递归与非递归实现)

    在实际编程中,递归方法可能更容易理解和实现,但可能会遇到栈溢出的问题,特别是当N和M都很大时。非递归方法虽然实现起来稍微复杂一些,但更适用于大数据集,因为它避免了递归带来的额外开销。 在给定的文件...

    分治算法求最大值与最小值,找最小元素

    分治算法是一种重要的计算机科学中的算法设计思想,它将一个复杂的问题分解成多个规模较小的相同或相似的子问题,然后分别解决这些子问题,最后将子问题的解合并得到原问题的解。这种策略有助于简化问题处理,提高...

Global site tag (gtag.js) - Google Analytics