【编程之美】读书笔记:寻找最大的K个数

【数据结构】TopK问题 手把手教你TopK算法 阅读详情

 

    

 

 

 

 

 

             问题:查找大量无序元素中最大的K个数。

         解法一:该解法是大部分能想到的,也是第一想到的方法。假设数据量不大,可以先用快速排序或堆排序,他们的平均时间复杂度为O(N*logN),然后取出前K个,时间复杂度为O(K),总的时间复杂度为O(N*logN)+O(K).
        当K=1时,上面的算法的时间复杂度也是O(N*logN),上面的算法是把整个数组都进行了排序,而原题目只要求最大的K个数,并
不需要前K个数有限,也不需要后N-K个数有序。可以通过部分排序算法如选择排序和交换排序,把N个数中的前K个数排序出来,复杂度为O(N*K),选择哪一个,取决于K的大小,在K(K<logN)较小的情况下,选择部分排序。


         解法二:(掌握)避免对前K个数进行排序来获取更好的性能(利用快速排序的原理)。
        假设N个数存储在数组S中,从数组中随机找一个元素X,将数组分成两部分Sa和Sb.Sa中的元素大于等于X,Sb中的元素小于X。
    出现如下两种情况:
   (1)若Sa组的个数大于或等于K,则继续在sa分组中找取最大的K个数字 。
   (2)若Sa组中的数字小于K ,其个数为T,则继续在sb中找取 K-T个数字 。
   一直这样递归下去,不断把问题分解成小问题,平均时间复杂度为O(N*logK)。
   代码如下:

/*将数组a[s]...a[t]中的元素用一个元素划开,保存中a[k]中*/
void partition(int a[], int s,int t,int &k)  
{  
    int i,j,x;  
    x=a[s];    //取划分元素   
    i=s;        //扫描指针初值   
    j=t;  
    do  
    {  
        while((a[j]<x)&&i<j) j--;   //从右向左扫描,如果是比划分元素小,则不动
        if(i<j) a[i++]=a[j];           //大元素向左边移   
        while((a[i]>=x)&&i<j) i++;      //从左向右扫描,如果是比划分元素大,则不动 
        if(i<j) a[j--]=a[i];            //小元素向右边移   
  
    }while(i<j); //直到指针i与j相等    
a[i]=x;      //划分元素就位   
k=i;  
}  
/*查找数组前K个最大的元素,index:返回数组中最大元素中第K个元素的下标(从0开始编号),high为数组最大下标*/
int FindKMax(int a[],int low,int high,int k)
{ 
     int q;
int index=-1;
   if(low < high)  
      {  
        partition(a , low , high,q);  
        int len = q - low + 1; //表示第几个位置    
        if(len == k)  
         index=q; //返回第k个位置   
        else if(len < k)   
         index= FindKMax(a , q + 1 , high , k-len);     
       else 
        index=FindKMax(a , low , q - 1, k);  
      }  
    return index;

}
int main()
{
     int a[]={20,100,4,2,87,9,8,5,46,26};  
    int Len=sizeof(a)/sizeof(int); 
     int K=4;
 FindKMax(a , 0 , Len- 1 , K) ;    
    for(int i = 0 ; i < K ; i++)  
      cout<<a[i]<<" ";  
 return 0;
}



         解法三:(掌握)用容量为K的最小堆来存储最大的K个数。最小堆的堆顶元素就是最大K个数中的最小的一个。每次扫描一个数据X,如果X比堆顶元素Y小,则不需要改变原来的堆。如果X比堆顶元素大,那么用X替换堆顶元素Y,在替换之后,X可能破坏了最小堆的结构,需要调整堆来维持堆的性质。调整过程时间复杂度为O(logK)。 全部的时间复杂度为O(N*logK)。
          这种方法当数据量比较大的时候,比较方便。因为对所有的数据只会遍历一次,第一种方法则会多次遍历数组。 如果所查找的K的数量比较大。可以考虑先求出k` ,然后再求出看k`+1 到 2 * k`之间的数据,然后一次求取。
 
  代码如下:

void heapifymin(int Array[],int i,int size)
 {
    if(i<size)
 {
  int left=2*i+1;
  int right=2*i+2;
  int smallest=i;//假设最小的节点为父结点
  //确定三个结点中的最大结点
  if(left<size)
  {
   if(Array[smallest]>Array[left])
    smallest=left;
  }
  if(right<size)
  {
          if(Array[smallest]>Array[right])
    smallest=right;
  }

  //开始交换父结点和最大的子结点
       if(smallest!=i)
    {
     int temp=Array[smallest];
     Array[smallest]=Array[i];
     Array[i]=temp;
     heapifymin(Array,smallest,size);//对调整的结点做同样的交换
    }
 }
 }

//建堆过程,建立最小堆,从最后一个结点开始调整为最小堆
void min_heapify(int Array[],int size)
 {
  int i;
  for(i=size-1;i>=0;i--)
   heapifymin(Array,i,size);
  
 }
 //k为需要查找的最大元素个数,size为数组大小,kMax存储k个元素的最小堆
void FindMax(int Array[],int k,int size,int kMax[])
{

  for(int i=0;i<k;i++)
   kMax[i]=Array[i];
 //对kMax中的元素建立最小堆
   min_heapify(kMax,k);
 printf("最小堆如下所示 : \n");
for(i=0;i<k;i++)
printf("%4d",kMax[i]);
printf("\n");

 for(int j=k;j<size;j++)
  {
     if(Array[j]>kMax[0]) //如果最小堆的堆顶元素,替换
  {
        int temp=kMax[0];
  kMax[0]=Array[j];
     Array[j]=temp;
  //可能破坏堆结构,调整kMax堆
  min_heapify(kMax,k);
  }
  

  }


 
}

int main()
{
    
 int a[]={10,23,8,2,52,35,7,1,12};
 int length=sizeof(a)/sizeof(int);

    //最大四个元素为23,52,35,12
/***************查找数组中前K个最大的元素****************/
 int k=4;
 int * kMax=(int *)malloc(k*sizeof(int));
 FindMax(a,k,length,kMax);

   printf("最大的%d个元素如下所示 : \n",k);
    for(int i=0;i<k;i++)
        printf("%4d",kMax[i]);
 printf("\n");
 return 0;
}


         解法四:这也是寻找N个数中的第K大的数算法。利用二分的方法求取TOP k问题。 首先查找 max 和 min,然后计算出mid = (max + min) / 2该算法的实质是寻找最大的K个数中最小的一个。

const int N = 8 ;  
 const int K = 4 ;  
   
 /* 
 利用二分的方法求取TOP k问题。 
 首先查找 max 和 min,然后计算出 mid = (max + min) / 2 
 该算法的实质是寻找最大的K个数中最小的一个。  
  
  
 */  
   
 int find(int * a , int x) //查询出大于或者等于x的元素个数    
 {  
     int sum = 0 ;  
       
     for(int i = 0 ; i < N ; i++ )  
     {   
        if(a[i] >= x)  
          sum++ ;                  
     }  
      return sum ;  
 }  
   
 
 int getK(int * a , int max , int min) //最终max min之间只会存在一个或者多个相同的数字    
 {  
     while(max - min > 1)             //max - min的值应该保证比两个最小的元素之差要小    
      {  
        int mid = (max + min) / 2 ;  
        int num = find(a , mid) ;    //返回比mid大的数字个数    
        if(num >= K)                 //最大的k个数目都要比min值大    
           min = mid ;                 
        else  
           max = mid  ;  
      }  
      cout<<"end"<<endl;  
      return min ;  
 }  
   
 int main()  
 {  
   int a[N] = {54, 2 ,5 ,11 ,554 ,65 ,33 ,2} ;    
   int x = getK(a , 554 , 2) ;   
   cout<<x<<endl ;   
   getchar() ;   
   return 0 ;      
 }


该算法在实际应用中效果不佳。


          解法五:如果N个数都是正数,取值范围不太大,可以考虑用空间换时间。申请一个包括N中最大值的MAXN大小的数组count[MAXN],count[i]表示整数i在所有整数中的个数。这样只要扫描一遍数组,就可以得到第K大的元素。
代码如下:

for(sumCount = 0, v = MAXN -1; v >=0; v--)  
{  
       cumCount += count[v];  
       if(sumCount >= k)  
            break;  
}  
return v; 


        扩展问题:
1.如果需要找出N个数中最大的K个不同的浮点数呢?比如,含有10个浮点数的数组(1.5,1.5,2.5,3.5,3.5,5,0,- 1.5,3.5)中最大的3个不同的浮点数是(5,3.5,2.5)。
     解答:除了解法五不行,其他的都可以。因为最后一种需要是正数。
2. 如果是找第k到第m(0<k<=m<=n)大的数呢?
       解答:可以用小根堆来先求出m个最大的,然后从中输出k到m个。
3. 在搜索引擎中,网络上的每个网页都有“权威性”权重,如page rank。如果我们需要寻找权重最大的K个网页,而网页的权重会不断地更新,那么算法要如何变动以达到快速更新(incremental update)并及时返回权重最大的K个网页?
   解答:(解法三)用堆排序当每一个网页权重更新的时候,更新堆。

 举一反三:查找最小的K个元素

    解答:最直观的方法是用快速排序或堆排序先排好,在取前K小的数据。最好的办法是利用解法二和解法三的原理进行查找。
求一个数组中第K个最大值和最小值 这是一个非常简单的小程序,利用vc++做成的,输入数组的大小,然后输入数组的数据,再输入你要求的K的值,就可以求出你想要的值了! 立即下载

相关推荐

OCC入门指南:从零开始掌握Open CASCADE Technology

本文是Open CASCADE Technology(OCC)的入门指南,详细介绍了这款开源C++三维几何建模内核的核心概念与价值。内容涵盖从零开始搭建开发环境、编写第一个显示立方体的程序,到深入理解其几何与拓扑核心、掌握Draw测试工具及Handle内存管理等关键编程范式,旨在帮助开发者快速掌握这一工业级CAD/CAE/CAM应用开发利器。

java5的博客 1275

海量数据中找出前k大数(topk问题),一篇文章教会你

正常思路是把这N个数建成堆,然后 pop k次,即可找到最大的前k个值。 但是有些场景,上面的思路解决不了,比如N非常大的情况。 假设N是10亿,k是100,就不可能运行出结果。 因为如果这样建成堆的话,所占用的空间太大了。 10亿个整数需要多大的空间?答案是4GB。 4GB的内存啥电脑来了也吃不消,再说100亿,1000亿呢? 可见这不是一个可行的方法,咱们另辟蹊径。 我们知道,当数据很大时,它不会存在内存上,而是转而储存在磁盘文件里,所以我们的思路就转向磁盘文件。 磁盘中能建堆吗?答案是

陈大大陈的博客 2622

麒麟V10系统命令实战指南:从入门到精通

本文为麒麟V10操作系统用户提供了一份从入门到精通的命令行实战指南。内容涵盖文件管理、进程监控、网络诊断、文本处理及系统管理等核心场景,旨在帮助用户转变思维,掌握高效解决实际问题的系统命令技巧,从而提升在麒麟V10环境下的运维与工作效率。

sat99的博客 594

c语言 获得数组最大k个数的索引的一种思路

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

qq_41601153的博客 1315

基于 WebGoat 平台的 SQL 注入攻击

基于 WebGoat 平台的 SQL 注入攻击

Labulongdong的博客 3521

【论文阅读1】机理引导的残差学习用于电池全生命周期状态监测 | Nature Communications

本文提出了一种机理引导的残差学习框架,用于提升电池全生命周期内荷电状态(SOC)和健康状态(SOH)的监测精度。该方法融合等效电路模型的先验知识与机器学习,设计了修正模型和补偿模型两种通用框架。实验验证表明,该方法在三种不同类型电池数据集上均表现出色,SOC和SOH估计误差较传统方法降低50%以上,且在未见工况下仍保持良好外推能力。模型具有强鲁棒性,在减少训练数据量和降低采样频率时性能稳定,并兼具物理可解释性。该框架无需离线测试和运行中校准,为电池安全监测提供了有效解决方案。

qq_21843433的博客 614

编程之美2.5 寻找第k大的数

参考+理解     名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以下的方式,觉得很好,推荐给大家。       所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题。(注意这组数中可能有重复值)       解法1:我们可以对这个乱序数组按照从大到小先行排序

水滴石穿 1万+

【UE5】映射方式:动作映射(Action Mappings) 与 轴映射(Axis Mappings)

链接:https://pan.baidu.com/s/1nQHvZXC4BDsfbFWDYZqEfA?按下键盘A键,不要抬起,屏幕左上角打印了一次。(和Unity中的轴映射机制类似)下面我们通过测试更直观的了解一下这。抬起键盘A键,屏幕左上角打印了一次。项目资源文末百度网盘自取。再添加一个按键,选择键盘。键,缩放值设置为 2.0。,框选所有测试节点,按下。的情况下,屏幕一直打印。

weixin_64072619的博客 3497

TOP-K问题(清晰,巨全)

毫无疑问,TOP-K问题太太太太重要了,尤其是面试中。之前在学校专业英语课程中简单分享过大数据处理中Hadoop(分布式计算开源框架)的相关知识,也是从TOP-K问题入手的。 在看了很多相关的博文之后,有很多伙伴也介绍的很详细,但是我认为接下来分享的大神(大大大神)的文章讲的清楚的一批: 58沈剑 架构师之路 为了自己方便看,以及之后丰富此篇章的内容,就直接截下来了。 不得不说,讲的太清晰了,当然,各种方法的具体实现还是要认真掌握的。 其实之前还了解到一种方法就是BitMap

偏执狂的博客 1万+

PCB印刷电路缺陷检测实战:从数据集准备到模型训练全流程解析

本文详细解析了PCB缺陷检测从数据集准备到模型训练的全流程。重点介绍了PKU-Market-PCB数据集的特点与下载方法,并提供了数据格式转换、模型选择(如YOLOv8)与训练配置的实战代码。针对PCB小目标检测的难点,文章给出了数据分析和模型优化的具体策略,帮助读者构建高效的缺陷检测系统。

weixin_29065791的博客 546

基于DFT的scanshift sdc模板(DFT)

摘要:本文详细介绍了DFT测试模式下的SDC约束方法。

murphyrong的博客 882

【编程之美】读书笔记:寻找最大的K个数[转帖]

问题:查找大量无序元素中最大的K个数。          解法一:该解法是大部分能想到的,也是第一想到的方法。假设数据量不大,可以先用快速排序或堆排序,他们的平均时间复杂度为O(N*logN),然后取出前K个,时间复杂度为O(K),总的时间复杂度为O(N*logN)+O(K).         当K=1时,上面的算法的时间复杂度也是O(N*logN),上面的算法是把整个数组都进行了排序,而

leo115的专栏 2039

手把手教你学Simulink--基于Simulink的高速公路自动驾驶场景仿真建模

特点车道保持:自动调整车辆方向以保持在车道中央。自适应巡航控制(ACC):根据前方车辆的速度自动调节车速。换道辅助:安全地变换车道以超过慢速行驶的车辆或准备驶离高速公路。紧急制动:检测潜在碰撞并采取措施避免事故。挑战安全性:确保所有功能在各种条件下都能可靠运行。实时性:处理大量传感器数据,并迅速做出反应。复杂性:集成多个子系统,包括感知、规划与控制。首先明确要模拟的任务内容。车辆需保持在车道内行驶。根据交通情况自动调整速度。安全地执行换道操作。在必要时实施紧急制动。

MHD0815的博客 246

《编程之美》读书笔记07: 2.5 寻找最大的K个数

《编程之美》读书笔记07: 2.5 寻找最大的K个数 问题: 从n个数中找出最大的k个数。 两种思路: 1 保存目前找到的最大k个数,每访问一个数,就与这k个数中的最小值比较,决定是否更新这k个数。储存k个数的数据结构可采用:败者树、二叉查找树、最小堆。 C++ STL提供了multiset和priority_queue容器,另外还提供了make_heap,push_heap,pop_h...

weixin_33909059的博客 194

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

《编程之美》——寻找最大的K个数

题目: N个无序的数(可能数目非常大),选出其中最大的K个数。分析与解法:【解法一】 对N个数进行排序,然后选出最大的K个数。可以使用快速排序或堆排序,时间复杂度为O(NlogN)。 因为这里N的数目可能非常大,即N>>K,而前N-K个数可以不进行排序,使用可以部分排序的算法,如选择排序或交换排序,时间复杂度为O(NK)。【解法二】 当N的数值很大的时候,即N>>K。可以使用快速排序中的pa

zengzhen_优快云的博客 3299

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

《编程之美》 : 寻找最大的K个数

用于解决类似:10亿个浮点数,找出当中最大的10000个之类的问题。《编程之美》上一共五种解法:解法一:利用选择排序和冒泡排序,这两者的复杂度都属O(N*K)解法二:和STL中的nth_element(first, nth, last)思路一样。首先在[first, last)上寻找一个阈值(可采用三点中值法),根据这个阈值将[first, last)分成两段,前一段所有值都小于等于(或大于等于)阈值,后一段所有数都大于等于(或小于等于)阈值。如果阈值所在的位置>nth,则说明第nth个数在前半段,否则nt

cesc 938

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

寻找最大的K个数

《编程之美》——寻找最大的K个数(P139) 解法一:寻找最大的K个数最容易想到的方法是排序然后找出最大的K个数,在这里快速排序和堆排序都是不错的选择,他们的平均时间复杂度都是O(N*logN)。 堆排序代码如下 #define LeftChild(i) (2*(i)+1) static void swap(ElementType *lhs, ElementType *rhs) { Ele

子同的专栏 1097

编程之美读书笔记_2.5 寻找最大的K个数

2.5 寻找最大的K个数从n个数中寻找最大的k个数,两种思路:1 保存目前找到的最大k个数,每访问一个数,就与这k个数中的最小值比较,决定是否更新这k个数。储存k个数的数据结构可采用:败者树、二叉查找树、最小堆。C++ STL提供了multiset和priority_queue容器,另外还提供了make_heap,push_heap,pop_heap方便手动构建堆结构。(测试发

flyinghearts的专栏 2731

编程之美读书笔记(4)寻找最大的K个数

问题: 有很多无序的数,从中找出最大的K个数。假定他们都不相等。 解法一: 如果数据不是很多,例如在几千个左右,我们可以排一下序,从中找出最大的K个数。排序可以选择快速排序或者堆排序 #include #include int cmp(const void *a,const void *b){ return *(int *)a - *(int *)b; } int main(){

落日小屋 3713

编程之美2.5 寻找最大的K个数

在一个数组中寻找最大的K个数,我们首先说一种非常简单的方法,利用快速排序中的分割算法,即我们经常看见的partition。这个函数会返回一个 int 类型的值,这个值代表的是前一半数字和后一半数字的分割点,前一半数字都小于等于后一半数字(递增排序),所以,我们只要找到相对应的分割点,即可以找到最大的K个数,或者最小的K个数,这就是利用线性方法可以完成任务的方法。      首先,给出函数声明:in

张勤一 1964

【编程之美】寻找最大的K个数

问题:寻找最大的K个数。 解法1:对于N个数,先取前K个数建立一个小根堆,此时根顶元素是最小的,另外剩余N-K个元素,取出一个与小根堆堆顶元素比较,如果大于堆顶元素,则替代之,再进行堆的调整,对于其余的N-K-1个元素也是这样,分别于堆顶元素比较,当比较完的时候,这时的K个元素的堆就变成了最大的K个数。另外这种方法同时得到了前K大个数中最小的那个即堆顶元素。即得到了第K大元素。    用容量为

hllyyy的专栏【Nothing replaces hard work】 703

寻找数组中最大的K个数

题目 编程之美上的寻找N个数中最大的前K数,给出了一种算法,我认为比较好: 算法是这样写的: 假设N个数存储在数组S中,我们从数组S中随机选出一个元素X,把数组分为两部分Sa和Sb.Sa中的元素都大于X,Sb中的元素都小于X,这时,有两种可能性: 1.Sa中元素的个数小于K,Sa中所有的数和Sb中最大的K-|Sa|个数(|Sa|指Sa中元素的个数)就是数组S中最大的K个数。 2.Sa中元

Boyhou 的专栏 1599

[编程之美] 2.5 寻找最大的K个数

从一串数字中寻找最大的K个数,而且考虑数据量比较大的情况。

追寻梦想的青春 1577
上一篇: 【排序算法】堆排序
下一篇: 【编程之美】读书笔记:求数组的子数组之和的最大值
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值