Top K 问题就是从一个数组中找打最大的 K 个数。
解法一:排序,取连续 K 个数
将数组从大到小排序后,前面 K 个数就是 Top K。
该解法的时间复杂度在于排序。所选排序算法的不同,会影响到执行效率。
所以可以选一个时间复杂度为 O(n*lg(n)) 的算法,即该解法的时间复杂度为 O(n*lg(n))
解法二:局部排序,取连续 K 个数
这是对解法一的改进。即,在排序过程中,排出最大的 K 个数时就停止排序,不需要对整个数组进行排序。
大致过程:
- 扫描数组中的元素,把其中最大的数移到数组的最左边;
- 重复执行该操作 K 次,就得到了 Top K
- 注意每次都是针对右侧子数组进行排序,不包括上一次排序得到的最大数
该解法时间复杂度为 O(n*k)
解法三:先取 K 个数,遍历剩余元素,将其和这 K 个数进行比较,如果比这个 K 个数中的最小值大,则执行替换操作
这是对解法二的改进。即,不对 Top K 元素排序。
事实上,为了加快剩余元素和已有 K 个数的比较,会将 K 个数存放在一个小顶堆中。
也就是,从严格意义上说,Top K 是经过排序的,但是操作小顶堆的时间复杂度为 O(lg(k))。
该解法的时间复杂度为 O(n*lg(k))。
解法四:用减治法递归划分出 Top K
大致过程:
- 用首个元素将数组分成左右两部分,左边的都比它大,右边的都比它小;
- 如果左边刚好是 K 个数,它们就是 Top K;
- 如果左边多于 K 个数,则再对左边进行划分;
- 如果左边少于 K 个数,则再对右边进行划分作为补充;
- 最终递归得到 Top K
该解法的时间复杂度为 O(n)
List<Integer> getTopK(int[] arr, int k) { int last; if (k <= 0) { last = -1; } else if (k >= arr.length) { last = arr.length - 1; } else { last = partition(arr, 0, arr.length - 1, k); } ArrayList<Integer> result = new ArrayList<>(last + 1); for (int i = 0; i <= last; i++) { result.add(arr[i]); } return result; } int partition(int[] arr, int low, int high, int k) { if (k >= high - low + 1) { return high; } int mid = low; for (int i = low + 1; i <= high; i++) { if (arr[i] > arr[mid]) { pop(arr, mid, i); mid++; } } int largerCount = mid - low; if (largerCount == k) { return mid - 1; } else if (largerCount + 1 == k) { return mid; } else if (largerCount == 0) { return partition(arr, low + 1, high, k - 1); } else if (largerCount > k) { return partition(arr, low, mid - 1, k); } else { return partition(arr, mid, high, k - largerCount); } } void pop(int[] arr, int first, int last) { int tmp = arr[last]; for (int i = last; i > first; i--) { arr[i] = arr[i - 1]; } arr[first] = tmp; }
相关推荐
### TopK 问题的五种解决方案 在计算机科学与数据处理领域中,TopK 问题是一种常见的需求场景,其核心任务是从一个数组或列表中找到最大的 K 个元素。这类问题广泛应用于各种场合,比如搜索引擎返回最相关的 K 条...
在处理海量数据时,TopK问题是一个常见的挑战,特别是在机器学习和数据分析中。它涉及到找出数据集中出现频率最高的前K个元素或者数值最大的前K个元素。这个问题在大数据场景下尤为棘手,因为直接一次性加载所有数据...
topk问题的Python实现,k-堆实现
TopK问题(大顶堆 + 快排)
6. **代码实现**:“BinarySearchST-master”可能包含了一个具体的二分查找静态表的实现,我们可以通过阅读源码来学习如何结合二分查找和有序表解决topK问题。 综上,这个主题将涉及数据结构(有序表)、算法(二分...
"Java实现TopK问题的方法" Java实现TopK问题的方法是指在大量数据中找到TopK个最大或最小的元素, 这是一个常见的算法问题。下面将从两种方法来实现Java实现TopK问题:基于快排的TopK实现和堆排序实现TopK。 基于...
Heap排序是解决Top K问题的常用方法,我们可以使用Heap来存储Top K个元素,然后不断地将新的元素与Heap的根节点进行比较,如果新的元素比Heap的根节点更大,那么就将新的元素加入Heap中,并将Heap的根节点删除。...
5. **堆结构**:另一种解决Top K问题的方法,可以使用大顶堆,每次插入元素并调整堆,保持堆顶总是最大的元素。当堆的大小达到k时,堆顶的k个元素即为最大的k个数。 6. **异常处理**:在实现中,需要考虑k大于数组...
文档中还提到了使用堆来解决 Top K 问题。堆是一种特殊的树形数据结构,可以维护一个部分有序的集合,并支持高效的插入、删除和查找最大(或最小)元素。这里使用了一个最小堆,当堆大小达到 K 时,每次读取新的...
标题中的“TOPK算法的Hash实现”指的是使用哈希数据结构来解决找出数据集中最大或最小的K个元素的问题。这种算法通常用于大数据处理和实时分析中,因为哈希表可以提供快速的查找和更新操作。 TOPK算法的核心是通过...
### TopK问题的解决思路 `TopK`问题是指在一组数据中找出前K个最大的或最小的元素。利用自定义的大顶堆,我们可以有效地解决这个问题。当大顶堆的大小为K时,堆顶的元素始终是最大的K个元素中的最大值。每次弹出堆...
TopK问题常见于数据分析中,它要求找到数据集中最大的K个元素。 例如,如果我们有一个销售记录表,可能需要找出销售额最高的前10个产品。这将涉及对所有产品销售额的排序,然后选取排名前10的项。在实际操作中,这...
1. **Top K问题**:Top K问题是指在一组数据中找出出现频率最高的K个元素,常用于数据分析、搜索引擎优化等领域。在这个面试题中,目标是找出最热门的10个查询字符串。 2. **排序算法**: - **直接排序法**:最...
二分法Top K算法的空间复杂度主要取决于递归栈的深度,由于每次划分都会减小问题规模,最坏情况下需要递归log2N层,因此空间复杂度为O(logN)。 5. **适用场景** 此算法适用于数据可以完全加载到内存中的情况,...
在计算机科学和编程领域,Top-K问题是一个常见的数据处理任务,它涉及到从大量数据中找出最大的K个元素。在这个场景中,我们讨论的是一个用Java实现的简单Top-K算法。这个算法的目标是高效地找到一个数据集合中的前K...
在计算机科学和编程领域,"通过最大堆求topk"是一种高效的算法,常用于寻找一个大数组中的前k个最大元素。这个算法的核心是利用数据结构——最大堆(Max Heap)来实现。最大堆是一种完全二叉树,其中每个父节点的值...