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

MIT-寻找第k小的元素

文章目录

  • 问题描述
  • 例子
  • 算法实现
    • 暴力算法
    • 分治算法(快排思想)

问题描述

给定一个包含 nnn 个互不相同整数的数组 A[n]A[n]A[n],以及一个正整数 kkk,请你找出数组 AAA 中第 kkk 小的元素。

例子

输入
A = [7, 10, 4, 3, 20, 15]
k = 3输出
7

算法实现

暴力算法

寻找第 kkk 小的元素最直接的方法是对所有的元素排序,然后取出数组 AAA 中第 kkk 个元素(A[k]A[k]A[k])。

int bruteSearchKth(int &A[], int k, int n)
{quickSort(A, 0, n - 1);return A[k - 1];
}

时间复杂度:O(nlog⁡2n)O(n\log_2 n)O(nlog2n)


分治算法(快排思想)

MIT-归并排序和快速排序:参考这篇文章的 partition 函数。

int partition(int &A[], int low, int high)
{int i = low - 1, j = low;int x = A[high];while (j <= high - 1){if (A[j] < x) swap(A[ ++ i], A[j]);j ++ ;}swap(A[i + 1], A[high]);return i + 1;
}

我们记 partition 函数返回的值是 qqq,即表示第 qqq 小的数 A[q]A[q]A[q],那么:

  • k<qk<qk<q,则我们要找的结果就是在 [low,q−1][low, q-1][low,q1]
  • k>qk>qk>q,则我们要找的结果就是在 [q+1,high][q+1, high][q+1,high]
  • k=qk=qk=q,则 qqq 正是我们要找的那个值。
int DCSearchKth(int &A[], int k, int low, int high)
{int q = partition(A, low, high);if (q == k - 1) return A[q];else if (k - 1 < q) return DCSearchKth(A, k, low, q - 1);else (k > q) return DCSearchKth(A, k, q + 1, high);
}

时间复杂度:O(n)O(n)O(n)

假设 n=2hn=2^hn=2hT(1)=O(1)T(1)=O(1)T(1)=O(1)T(n)T(n)T(n) 是执行一次大小为 nnn 次的 DCSearchKth 所需的时间。(假设每次都只进入分区的一半)

  • DCSearchKth(A, low, q - 1)DCSearchKth(A, q + 1, high)T(n2)T(\frac{n}{2})T(2n)
  • quickSort(A, mid + 1, high)T(n2)T(\frac{n}{2})T(2n)
  • int q = partition(A, low, high)O(n)O(n)O(n)

T(n)=T(n2)+O(n)≤T(n2)+cn≤T(n22)+cn(1+12)≤...≤T(n2h)+cn[(12)0+(12)1+(12)2+...+(12)h−1]=T(1)+2cn(2−h−1)=T(1)+2cn(1n−1)≤O(1)+2cn=O(n)\begin{aligned} T(n)&=T(\frac{n}{2})+O(n) \\&\leq T(\frac{n}{2})+cn \\&\leq T(\frac{n}{2^2})+cn(1+\frac{1}{2}) \\&\leq ... \\&\leq T(\frac{n}{2^h})+cn\left[(\frac{1}{2})^0+(\frac{1}{2})^1+(\frac{1}{2})^2+...+(\frac{1}{2})^{h-1}\right] \\&= T(1)+2cn(2^{-h}-1) \\&=T(1)+2cn(\frac{1}{n}-1) \\&\leq O(1)+2cn \\&=O(n) \end{aligned}T(n)=T(2n)+O(n)T(2n)+cnT(22n)+cn(1+21)...T(2hn)+cn[(21)0+(21)1+(21)2+...+(21)h1]=T(1)+2cn(2h1)=T(1)+2cn(n11)O(1)+2cn=O(n)

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

相关文章:

  • CAN(三)——过载帧
  • vscode编辑arduino项目
  • 哪些网站的做的好看的设计网站定制公司
  • 架构负债不仅仅是技术负债
  • 建设网站的规划书wordpress 评论已关闭
  • BPC合并流程(持续更新中)
  • Python中常用内置函数上【含代码理解】
  • 第29章 光源的涅槃(秀秀)
  • 影像测量仪是什么?有哪些功能用途
  • Gemini国内怎么使用(2025/11/04)
  • 用vs做网站教程策略网页游戏大全
  • 你知道什么是实时分账吗?
  • Prim 算法
  • 网站开发售后服务承诺高端品牌网站建设兴田德润可信赖
  • 带数据库的网站怎么建品牌建设和品牌打造对企业的意义
  • 仿建网站WordPress切换标记
  • 正规的网站制作电话多少120救护车收费价格表
  • orcal中的连接问题
  • ESP32事件组替代全局变量:高效控制任务循环
  • Go内存管理最佳实践:提升性能的Do‘s与Don‘ts|Go语言进阶(17)
  • MiniEngine学习笔记 : CommandAllocatorPool
  • 常见的数据库测试工具有哪些?
  • 长沙市制作企业网站公司企业网站模板建站流程
  • 建立网站的程序大连网站建设dl zw
  • 小迪安全v2023学习笔记(一百四十四天)—— Webshell篇静态查杀行为拦截流量监控代码混淆内存加载工具魔改
  • 【仓颉纪元】仓颉语言特性深度解析:鸿蒙原生开发的新引擎
  • 团购网站模板免费下载wordpress导航小图标
  • 企业网站建设的意义做米业的企业网站
  • MySQL系列之数据类型(String)
  • Janet 介绍