热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

深入线性时间复杂度求数组中第K大数的方法详解

本篇文章是对线性时间复杂度求数组中第K大数的方法进行了详细的分析介绍,需要的朋友参考下
求数组中第K大的数可以基于快排序思想,步骤如下:
1、随机选择一个支点
2、将比支点大的数,放到数组左边;将比支点小的数放到数组右边;将支点放到中间(属于左部分)
3、设左部分的长度为L,
当K 当K > L时,递归地在有部分中找第(K - L)大的数
当K = L时,返回左右两部分的分割点(即原来的支点),就是要求的第K大的数
以上思想的代码实现如下:
代码如下:

/**
线性时间复杂度求数组中第K大数
** author :liuzhiwei
** data   :2011-08-07 
**/
#include "iostream"
using namespace std;
//基于快速排序思想,求数组a中第k大的数,low和high分别为数组的起始和结束位置
//时间复杂度为o(n),n为数组的长度
//1<=k<=n
//如果存在,返回第k大数的下标,否则返回-1
int selectk(int a[], int low, int high, int k)
{
 if(k <= 0)
  return -1;
 if(k > high - low + 1)
  return -1;
 int pivot = low + rand()%(high - low + 1);    //随即选择一个支点
 swap(a[low], a[pivot]);
 int m = low;
 int count = 1;
 //一趟遍历,把较大的数放到数组的左边
 for(int i = low + 1; i <= high; ++i)
 {
  if(a[i] > a[low])
  {
   swap(a[++m], a[i]);
   count++;              //比支点大的数的个数为count-1
  }
 }
 swap(a[m], a[low]);           //将支点放在左、右两部分的分界处
 if(count > k)
 {
  return selectk(a, low, m - 1, k);
 }
 else if( count  {
  return selectk(a, m + 1, high, k - count);
 }
 else
 {
  return m;
 }
}
int main(void)
{
 int a[] = {5, 15, 5, 7, 9, 17,100, 3, 12, 10, 19, 18, 16, 10, 1000,1,1,1,1,1,1,1,1};
 int r = selectk(a, 0, sizeof(a) /sizeof(int) - 1, 5);
 cout<<(r == -1 ? r : a[r])< system("pause");
 return 0;
}

稍微改动一下,就可以修改为求数组中第K小数
完整的代码如下:
代码如下:

/**
线性时间复杂度求数组中第K小数
** author :liuzhiwei
** data   :2011-08-07 
**/
#include "iostream"
using namespace std;
//基于快速排序思想,求数组a中第k小的数,low和high分别为数组的起始和结束位置
//时间复杂度为o(n),n为数组的长度
//1<=k<=n
//如果存在,返回第k小数的下标,否则返回-1
int selectk(int a[], int low, int high, int k)
{
 if(k <= 0)
  return -1;
 if(k > high - low + 1)
  return -1;
 int pivot = low + rand()%(high - low + 1);    //随即选择一个支点
 swap(a[low], a[pivot]);
 int m = low;
 int count = 1;
 //一趟遍历,把较小的数放到数组的左边
 for(int i = low + 1; i <= high; ++i)
 {
  if(a[i]  {
   swap(a[++m], a[i]);
   count++;              //比支点小的数的个数为count-1
  }
 }
 swap(a[m], a[low]);           //将支点放在左、右两部分的分界处
 if(k  {
  return selectk(a, low, m - 1, k);
 }
 else if( k > count)
 {
  return selectk(a, m + 1, high, k - count);
 }
 else
 {
  return m;
 }
}
int main(void)
{
 int a[] = {5, 15, 5, 7, 9, 17,100, 3, 12, 10, 19, 18, 16, 10, 1000,1,1,1,1,1,1,1,1};
 int r = selectk(a, 0, sizeof(a) /sizeof(int) - 1, 23);
 cout<<(r == -1 ? r : a[r])< system("pause");
 return 0;
}

推荐阅读
  • 本文探讨了2019年前端技术的发展趋势,包括工具化、配置化和泛前端化等方面,并提供了详细的学习路线和职业规划建议。 ... [详细]
  • 本题要求计算给定两个正整数a和b时,2的-a次方与2的-b次方之和,并将结果以最简分数形式表示。输入包括多组测试数据,每组数据包含两个在2到20范围内的整数。 ... [详细]
  • 本文探讨了如何利用SqlDependency执行复杂的SQL查询,并确保在多线程环境下的安全性与效率。 ... [详细]
  • 本文详细介绍了ActivityManagerService (AMS) 的工作原理及其在Android系统中的重要角色。AMS作为system_server进程的一部分,在系统启动时加载,负责管理和协调应用程序中的Activity和服务(Service)。文章将通过具体的接口图和通信流程,帮助读者更好地理解AMS的工作机制。 ... [详细]
  • 本文介绍了一个使用 C++ 实现的进度条功能,通过自定义函数指针和控制台输出来展示任务完成的进度。 ... [详细]
  • 如何恢复CAD中意外丢失的图纸数据
    当使用CAD进行绘图时,因突然断电或其他原因导致计算机关闭可能会造成工作数据的丢失。然而,通过利用CAD软件的自动保存功能,用户通常能够恢复至最近一次自动保存的数据状态。 ... [详细]
  • 本文介绍了一系列针对iPhone 6s的优化方法,包括系统版本选择、内存管理、软件卸载以及特定设置调整,帮助用户改善设备的运行速度和整体性能。 ... [详细]
  • 本文深入探讨 PHPCMS 平台中的字符串截取函数 str_cut 的使用方法,该函数常用于控制输出的标题或内容摘要长度,有效避免因过长的文本导致的页面布局问题。通过本文,读者将掌握如何灵活运用此函数,包括处理 HTML 标签等高级技巧。 ... [详细]
  • 随着iTunes界面的更新,用户发现通过该平台安装IPA文件变得不再可能。面对这一变化,除了苹果官方推荐的TestFlight外,还有哪些高效便捷的方法呢?本文将为您详细介绍几种替代方案。 ... [详细]
  • JavaWeb技术架构解析
    本文探讨了JavaWeb开发中客户端与服务器端的交互模式,重点分析了B/S(浏览器/服务器)和C/S(客户端/服务器)两种架构的特点及应用场景。 ... [详细]
  • 本文介绍了如何使用JavaScript和jQuery实现页面元素随着滚动条的移动而相应变化位置的功能,提供了一段简洁的代码示例。 ... [详细]
  • iTOP4412开发板QtE5.7源码编译指南
    本文详细介绍了如何在iTOP4412开发板上编译QtE5.7源码,包括所需文件的位置、编译器设置、触摸库编译以及QtE5.7的完整编译流程。 ... [详细]
  • BFS深搜hashtable来判断是横线还是竖线但是为啥还是90分啊呜呜!找不到原因#define_CRT_SECURE_NO_WARNINGS1#include ... [详细]
  • 在M1 Mac上使用Xcode编译iOS模拟器项目时,可能会遇到错误提示 'building for iOS Simulator, but linking in object file built for iOS, for architecture arm64',本文将提供解决方案。 ... [详细]
  • 在与客户的互动中,我们经常被问及BI系统是否提供了特定行业的解决方案。实际上,作为数据分析工具,BI系统的通用性远大于其行业针对性。本文将探讨BI系统的通用性和行业适应性。 ... [详细]
author-avatar
的闪客快打
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有