当前位置: 首页 > news >正文

动易会提示模版文件"默认网站首页问答模板.html"找不到做兼职的网站都有哪些

动易会提示模版文件"默认网站首页问答模板.html"找不到,做兼职的网站都有哪些,wordpress 4.7.11漏洞,山西省这房和城乡建设厅网站堆在解决 Top K 问题(即从海量数据中找出最大或最小的 K 个元素)中非常高效,核心思想是通过维护一个固定大小的堆结构,避免对全部数据进行排序,从而显著降低时间和空间复杂度。 一、Top K 问题的两种场景 静态数据&am…

        堆在解决 Top K 问题(即从海量数据中找出最大或最小的 K 个元素)中非常高效,核心思想是通过维护一个固定大小的堆结构,避免对全部数据进行排序,从而显著降低时间和空间复杂度。

一、Top K 问题的两种场景

  1. 静态数据:数据已全部存储在内存或磁盘中。

  2. 动态数据流:数据持续输入,需要实时维护 Top K 结果。

二、堆的两种应用策略

1. 找最大的 K 个元素 → 最小堆(Min-Heap)
  • 核心思想:维护一个大小为 K 的最小堆,堆顶是当前 K 个元素中的最小值

  • 操作步骤

    1. 初始化堆:将前 K 个元素直接插入最小堆。

    2. 遍历剩余元素

      • 若当前元素 > 堆顶元素(即比当前 K 个中的最小值大):

        •  替换堆顶元素。

        •  从堆顶向下调整(Heapify Down),恢复最小堆性质。

      • 否则跳过。

    3. 最终结果:堆中所有元素即为最大的 K 个元素。

  • 时间复杂度:O(n log K)
    (每个元素最多进行一次堆调整,调整代价为 O(log K))

2. 找最小的 K 个元素 → 最大堆(Max-Heap)
  • 核心思想:维护一个大小为 K 的最大堆,堆顶是当前 K 个元素中的最大值

  • 操作步骤

    1. 初始化堆:将前 K 个元素插入最大堆。

    2. 遍历剩余元素

      • 若当前元素 < 堆顶元素(即比当前 K 个中的最大值小):

        • 替换堆顶元素。

        • 从堆顶向下调整(Heapify Down),恢复最大堆性质。

      • 否则跳过。

    3. 最终结果:堆中所有元素即为最小的 K 个元素。

  • 时间复杂度:O(n log K)

三、堆解决TOP K的优点: 

  1. 空间效率:只需维护大小为 K 的堆,空间复杂度为 O(K),适用于海量数据。

  2. 时间效率:避免全排序(O(n log n)),只需 O(n log K) 时间。

  3. 动态处理能力:支持数据流场景,逐个处理元素。

四、代码实现 (以找最大的 K 个元素为例

最小堆的向下调整
// 最小堆的向下调整(维护堆性质)
void minHeapify(int *heap, int k, int i) {int smallest = i;        // 当前最小节点int left = 2 * i + 1;    // 左子节点int right = 2 * i + 2;   // 右子节点// 找到当前节点、左子、右子中的最小值if (left < k && heap[left] < heap[smallest])smallest = left;if (right < k && heap[right] < heap[smallest])smallest = right;// 若最小值不是当前节点,交换并递归调整if (smallest != i) {int temp = heap[i];heap[i] = heap[smallest];heap[smallest] = temp;minHeapify(heap, k, smallest);}
}
用最小堆找出前K大的元素
// 构建最小堆(从最后一个非叶子节点开始调整)
void buildMinHeap(int *heap, int k) {for (int i = k / 2 - 1; i >= 0; i--)minHeapify(heap, k, i);
}// 用最小堆找出最大的K个元素
void findTopK(int *arr, int n, int k) {int *heap = (int *)malloc(k * sizeof(int));// 1. 初始化堆:取前K个元素for (int i = 0; i < k; i++) heap[i] = arr[i];buildMinHeap(heap, k);  // 构建最小堆// 2. 遍历剩余元素for (int i = k; i < n; i++) {// 若当前元素比堆顶大,替换并调整if (arr[i] > heap[0]) {heap[0] = arr[i];minHeapify(heap, k, 0);}}// 输出结果printf("最大的 %d 个元素: ", k);for (int i = 0; i < k; i++)printf("%d ", heap[i]);printf("\n");free(heap);
}

五、与其他方法的对比

方法时间复杂度空间复杂度适用场景
全排序后取前K个O(n log n)O(n)小数据量
快速选择算法O(n) 平均O(1)需要修改原数组
堆方法O(n log K)O(K)海量数据/数据流

        全排序:简单但低效,适合小数据多次查询。

        快速选择:高效平均时间,适合单次查询且可修改数组。

        堆方法:平衡时间与空间,适合海量数据或动态数据流。

 这里简单实现快速选择的思路(基于快排实现):

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 交换两个元素
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 分区函数(降序分区)
int partition(int arr[], int left, int right) {
    int pivot_idx = left + rand() % (right - left + 1);
    int pivot = arr[pivot_idx];
    swap(&arr[pivot_idx], &arr[right]); // 将pivot移到末尾
    
    int i = left;
    for (int j = left; j < right; j++) {
        if (arr[j] >= pivot) {
            swap(&arr[i], &arr[j]);
            i++;
        }
    }
    swap(&arr[i], &arr[right]); // 将pivot放回正确位置
    return i;
}

// 快速选择核心逻辑
void quick_select(int arr[], int left, int right, int k) {
    if (left >= right) return;
    
    int pos = partition(arr, left, right);
    if (pos == k) {
        return; // 找到第k大的元素,终止递归
    } else if (pos < k) {
        quick_select(arr, pos + 1, right, k); // 处理右半部分
    } else {
        quick_select(arr, left, pos - 1, k);  // 处理左半部分
    }
}

// 快速选择方法解决Top K(最大的K个元素)
void topk_quick_select(int arr[], int n, int k) {
    srand(time(NULL));
    quick_select(arr, 0, n - 1, k - 1); // 找到第k大的元素的位置
    
    // 输出前k个元素(注意:原数组已被部分修改)
    printf("快速选择结果: ");
    for (int i = 0; i < k; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

http://www.dtcms.com/a/517389.html

相关文章:

  • Xshell自用指南
  • 抽学号v6.6.6功能预设
  • 自助建站广告发布昆山网站设计
  • 沈阳设计网站公司坂田网站设计
  • 修复shell中复制粘贴中文乱码多#问题
  • 网站黑链 工具阿里巴巴运营的工作内容
  • 淘宝网站建设 深圳网站建设与维护的论述题
  • MySQL 开源主从复制实战指南(SRE 可靠性优先版)
  • Zephyr Custom Board Guide
  • 一页网站首页图如何做蛋糕公司网页设计模板
  • 网站建设这块是怎么挣钱抖音app下载
  • 中国建设银行快捷付授权网站双模网站开发
  • 网站建设推广代理商.概述网站建设的基本流程
  • android studio-设置android模拟器屏幕自动旋转
  • Linux复习(1)
  • 做网站高手武冈企业建站
  • xml解释 OA表单配置文件的权限信息
  • 临海网站制作好了如何上线一个网页前端和后端
  • 兰州网站建设最新招聘信息做特效很牛的一个外国网站
  • 零基础入门C语言之操作符详解1
  • 元隆盛建设集团有限公司网站青海企业网站建设开发
  • 福建网站建建设房地产销售流程详细
  • 面试学校网站开发平台公司债务风险
  • 工程建设教育网首页梧州网站优化价格
  • 建设银行陕西分行网站简单的网站首页模板
  • 方微商城网站开发wordpress内容主题模板下载失败
  • 一个主做海贼王的网站建设网站需要哪些硬件
  • 网站建设项目实训报告书设计官网和推广的公司
  • 代做网站转账截图新做的网站如何备案
  • 网站建设设计 飞沐高端网站建设公司服务好吗