《算法之美》---次序选择问题

算法复习——分而治之篇之次序选择问题 算法复习——分而治之篇之次序选择问题 以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 最小值查找: 例如给定数组A[1..16]A[1..16]A[1..16],寻找其中最小值,如下图所示。 依次扫描,记录最小值 那么,对问题稍加改变,如何求得数组中第kkk小的元素? 2. 问题定义 次序选择问题(Selection Problem) 输入: 包含nnn个不同元素的数组A[1..n]A[1..n]A[1..n] 整数k(1≤k≤n) 阅读详情

当一个序列排好序之后,我们一般会对其有两种操作:一是对其进行查找操作;一是得知任何特定元素在一个序列中的次序。当如果我们仅仅想知道某一个或某几个元素在序列里的次序,或者处于某个特定位置上的元素,则并不一定需要对整个序列进行排序。

在一个序列里面挑选处于特定位置的元素的问题就是所谓次序选择问题。一般定义如下:在n个元素里面选择出第i小(或大)的元素,即找出排名为i的元素。

快速次序选择算法是比直接对序列进行排序更优的次序选择算法,这个算法从快速排序算法改进而来。快速次序选择算法伪代码如下:

ORDER-SELECTION(A, p, q, i)     //在序列A[p…q]中选择第i小的元素

         if p=q then return A[p]         //已经找到第i小的元素

         r <-- PARTITION(A, p, q) //调用快速排序的分解算法

         k <-- r-p+1               //k = rank(A[r])

         if i=k then return A[r]  //已经找到第i小的元素

         if i<k then return ORDER-SELECTION(A, p, r-1, i) //在序列A[p…r-1]中选择第i小的元素

         else return ORDER-SELECTION(A, r+1, q, i-k)   //在序列A[r+1…q]中选择低i-k小的元素

 

如上伪代码所示,如果A[r]的次序(即代码里的变量k)不是序列里第i小的元素,则我们有两种情况:

1)A[r]的次序小于i,因此第i小的元素在元素A[r]的左边,即A[p…r-1]里。此时我们需要在A[p…r-1]里寻找第i小的元素;

2)A[r]的次序大于i,因此第i小的元素在元素A[r]的右边,即A[r+1…q]里。此时,我们需要在A[r+1…q]里寻找第i小的元素。不过此时我们已经丢掉了A[p…r]里面的所有元素,因此,整个序列里面第i小的元素在A[r+1…q]里则是第i-k小的元素。

 

快速次序选择最后情况下和平均情况下时间复杂度是Θ(n),最坏情况下是Θ(n2)。

 

快速选择算法虽然在多数情况下的时间成本是线性的,但最坏情况下却是平方级的。为了防止提供数据的对手使得排序情况总是最坏的,我们使用随机化手段,即得到如下的随机快速次序选择算法:

RANDOM-SELECTION(A, p, q, i)        //在序列A[p…q]中选择第i小的元素

         if p=q then return A[p]         //已经找到第i小的元素

         r <--RAND-PARTITION(A, p, q) //调用随机快速排序的分解算法

         k <-- r-p+1               //k = rank(A[r])

         if i=k then return A[r]  //已经找到第i小的元素

         if i<k then return RANDOM-SELECTION(A, p, r-1, i) //在序列A[p…r-1]中选择第i小的元素

         else return RANDOM-SELECTION(A, r+1, q, i-k)      //在序列A[r+1…q]中选择低i-k小的元素

此算法和快速选择算法唯一的不同是在分解的时候,不是选择A[p]作为杠杆点,而是从序列A[p…q]中随机选择一个元素作为杠杆点。

 

随机快速次序选择算法的实现代码如下:(摘自BlogJava)

#include <stdio.h>

#include <stdlib.h>

int new_random(int min, int max)

{

    return (min + (int)(((float)rand()/RAND_MAX)*(max - min)));

}

void swap(int *a, int *b)

{

    int c = *a;

    *a = *b;

    *b = c;

}

 

int partition(int A[], int p, int r)

{

    int i = p - 1, j;

    for(j = p; j < r; j++)

    {

        if(A[j] <= A[r])

        {

            i++;

            swap(&A[i], &A[j]);

        }

    }

    swap(&A[i + 1], &A[r]);

    return i + 1;

}

 

int randomize_partition(int A[], int p, int r)

{

    int i = new_random(p, r);

    swap(&A[i], &A[r]);

    return partition(A, p, r);

}

 

int randomized_select(int data[], int p, int r, int k)

{

    if(k > (r - p + 1)) return 0;

    if(p == r) return data[p];

    int i = randomize_partition(data, p, r);

 

    int count = i - p + 1;

    if(k <= count)

        return randomized_select(data, p, i, k);

    else

        return randomized_select(data, i + 1, r, k - count);

}

 

虽然随机快速次序选择问题在实际使用中效率很高,只要不是每次都运气很差的话,就可以保证线性时间的时间效率,而运气不差的关键是杠杆点选择的不是数组里面最小或最大的元素。即如果能够保证不选择序列里最大或最小的元素作为杠杆点,我们就能保证随机快速次序选择算法时间成本是线性的。

下面要讨论的算法就是用来保证杠杆点不选到序列中的最大值或最小值。这就是最坏情况下的线性选择算法,它是由Blum、Floyd、Pratt、Rivest和Tarjan在1973年提出的,该算法的核心就是尽量选择一个接近中间的杠杆点,伪代码如下:

LINEAR-SELECTION(i, n)      //在n个元素里面找出第i小的元素

         将n个元素分解为5元组,直接用蛮力找出每个5元组的中位数

         在获得的所有中位数中,递归找出它们的中位数x

         将元素按照最后获得的中位数进行分解,设k=rank(x)

         if i==k then

                   return x   //已经找到所需元素,结束算法

         else if i<k then

                   在小于x的部分递归选择第i小的元素

         else

                   //在大于x的部分递归选择第i-k小的元素

 

最坏情况下线性选择算法的代码实现如下:(摘自BlogJava,接上面代码)

void quicksort(int data[], int b, int e)

{

    if(b < e)

    {

        int k = partition(data, b, e);

        quicksort(data, b, k - 1);

        quicksort(data, k + 1, e);

    }

}

 

int partition1(int A[], int p, int r, int x)

{

    int i = p - 1, j;

    for(j = p; j <= r; j++)

    {

        if(A[j] <= x)

        {

            i++;

            swap(&A[i], &A[j]);

        }

    }

    A[i + 1] = x;

    return i + 1;

}

 

int select_new(int data[], int p, int r, int k)

{

    if(r - p < 75)

    {

        quicksort(data, p, r);

        return data[p + k - 1];

    }  

    int i;

    for(i = 0; i <= (r - p - 4) / 5; i++)

    {

        quicksort(data, p + 5 * i, p + 5 * i + 4);

        swap(&data[p + 5 * i + 2], &data[p + i]);

    }

    int x = select_new(data, p, p + (r - p - 4) / 5, (r - p - 4)/10); // 得到更好的轴X

    i = partition1(data, p, r, x);

    int count = i - p + 1;

    if(k <= count)

        return select_new(data, p, i, k);

    else

        return select_new(data, i + 1, r, k - count);

}

 

测试代码如下:(接上面代码)

int main()

{

    int data[] = {3, 1, 7, 34, 8, 11, 678, 12, -1, 100};

    printf("%d/n", randomized_select(data, 0, 9, 2));

    int data1[] = {3, 1, 7, 34, 8, 11, 678, 12, -1, 100};

    printf("%d/n", select_new(data1, 0, 9, 2));

  

     return 0;

}

 

虽然最坏情况下线性选择算法在最坏情况下的时间复杂度是线性级的,但它在实际中的运行效率却不如随机快速次序选择算法,这是因为该算法效率虽然是cn,但常数系数c的值很大!而且该算法的思路比随机快速次序选择算法负责,较难理解,因此,该算法除了在无聊时锻炼下脑筋,打发下时间之外,几乎没什么其他用处!

=======================================================

附:

常见的次序选择问题总结如下:

其中|m|表示对m向上取整;[m]表示对m向下取整。

类型1:选序列中的最大值:

算法思想或实现:

template<typename T>

T FindMax(T data[], int size)

{

         T max = data[0];

         for(int i=1; i<size; ++i)

         {

                   if(max < data[i])

                            max = data[i];

         }

         return max;

}

 

该算法最坏情况下的时间复杂度是O(n);在n个数的数组中找最大的数,并以比较作为基本的运算的算法类中,任何算法在最坏情况下至少要做n-1次比较。这是因为最大值max是惟一的,其他n-1个数必须在比较后才可能被淘汰,一次比较最多淘汰一个数,因此至少需要比较n-1次。FindMax算法是最优的了。

 

类型2:找序列中的最大值和最小值:

算法思想或实现:

1)将n个元素两两一组分为[n/2]组;

2)每组内两个数做比较,得到[n/2]个较小值和[n/2]个较大值;

3)在[n/2]个(若n为奇数时是[n/2]+1)较小值中找出最小值min;

4)在[n/2]个(若n为奇数时是[n/2]+1)较大值中找最大值max;

 

类型3:找序列中第二大值:

算法思想或实现:

锦标赛方法,最优!

1)将元素个数n赋值给变量k,因为k在后面循环中值要改变,所以不能直接用n值;

2)将k个元素分为两两一组,即分成了k/2组;

3)每组中2个数比较,找出较大值;

4)将被淘汰的较小的值在淘汰它的较大的值所维护的链表中做记录;

5)如果k是奇数,则k=k/2+1;否则k=k/2;

6)如果k>1,则转到2);

7)max = 最大值;

8)secondMax = max维护的链表中的所有数的最大值;

 

类型4:一般性选择问题:

输入:数组data[n],正整数k,1<=k<=n

输出:第k小的数

 

算法思想或实现:

Select(data, k):

1)将data划分成5个一组,共m=[n/5]组;

2)每组找中位数,找到的m个中位数放到数组M中;

3)m*=Select(M, |M|/2),接着将data中的数划分成A、B、C和D四个集合;

4)把A和D中的每个元素与m*比较,小的构成S1,大的构成S2;

5)S1=S1并C;S2=S2并B;

6)如果k==|S1|+1,则输出m*;

7)否则,如果k<=|S1|,则Select(S1, k);

8)否则Select(S2, k-|S1|-1)。

 

类型5:给定n个不同的数的集合S和正整数i,求最大的i个数;

算法A:调用i次找最大值算法FindMax,每调用一次从S中删除一个最大的数;

算法B:对S排序,并输出S中最大的i个数;

问:1)分析A、B两个算法在最坏情况下的时间复杂度;

2)试设计一个最坏情况下时间复杂度的阶更低的算法。

 

算法A的最坏时间复杂度:i*n = O(n3/2);

算法B的最坏时间复杂度:O(nlogn)。

 

算法思路或实现:

设k表示第i大的元素在排好序数组中的下标,元素记为x;

用选择算法确定这个元素,用x划分数组S,将比x大的放到x的后面;

对S中从k到n的元素进行排序,之后倒序输出即可。

 

输入:集合S

输出:S中最大的i个数

1)k=n-i+1;

2)x=Select(S, n, k);

3)用x划分S,将S中比x大的元素放到数组的k+1到n个位置;

4)对S[k…n]排序;

5)倒序输出

 

复杂度:O(n)+O(i*logi)。

 

 

 

 

 

C++实现 多处最优服务次序问题 题目:设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti,1<=ti<=n。共有s处可以提供此项服务。应如何安排n个顾客的服务次序才能使平均等待时间达到最小? 平均等待时间是n个顾客等待服务时间的总和除以n。 输入示例: n = 10, s = 2 56 12 1 99 1000 234 33 55 99 812 output: 336 注意:在这个问题里面,将服务时间与等待时... 阅读详情

相关推荐

algorithms(算法之美).pdf.zip

like Gutenberg probably only knew how to add and subtract small numbers using his fingers; for anything more complicated he had to consult

【算法(三·五):分治思想——次序选择问题】

本文介绍了次序选择问题的思想、实现过程及其与快速排序思想、所遇问题的比较。

计算机领域博客,与时俱进的思想与技术。 876

Python实战:3分钟搞定A股K线数据抓取(附东方财富/腾讯API完整代码)

本文为量化交易初学者提供了一份快速获取A股K线数据的实战指南。通过对比东方财富与腾讯财经两大免费API的优劣,并附上可直接运行的完整Python代码,帮助读者在3分钟内搭建起自己的数据抓取管道,为构建量化交易系统奠定坚实的数据基础。

weixin_29062255的博客 2910

次序选择问题

给定一个数组A,求出第k小的元素。 这是一个次序选择问题,求解方法多种,此处介绍在快排的思想上进行改造的分治算法。 原数组 原数组通过一次分解,求出随机选出的新主元的位置,该位置返回到主递归函数赋值给变量q 比较k和q的位置,若k在q的右边,则只对右边进行进一次拆分,若为左边则相反。直到q的位置刚好对应的是k所表达的位置,则此时q位置的元素为第k小的元素,因为它左边的都比它小,右边的都比它大。比较这一步要注意。 #include<iostream> using namespace std;

drdtddtrdr的博客 1762

AWR射频仿真基本操作(一)

这里只讲述一个基本的操作: 软件是AWR 14版本

钢丝 2万+

nupkg 本地安装_使用Nuget安装离线包nupkg

一:Nuget简介:NuGet 是免费、开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库。当需要分享开发的工具或是库,需要建立一个Nuget package,然后把这个package放到Nuget的站点。如果想要使用别人已经开发好的工具或是库,只需要从站点获得这个package,并且安装到自己的Visual Studio项目或是解决方案里。NuGet能更方便地把一...

weixin_34460380的博客 1万+

次序选择问题——分治法

问题背景:最小值查找,查找指定位置的元素 k为指定位置,q为主元位置,p为数组起始位置,q为数组结束位置, 该问题可参考快速排序

qq_46591394的博客 819

Qt图形几何之QRect详解:从基础操作到高级功能全解析

本文全面介绍了Qt框架中的QRect类,详细解析了其核心功能和使用方法。主要内容包括:1)QRect的基本概念与多种构造函数;2)矩形属性获取和状态判断方法;3)几何操作函数(移动、调整大小等);4)几何关系判断(包含、相交等);5)坐标变换和边距处理;6)实用功能与QRectF转换;7)综合应用示例(图形界面、碰撞检测、布局管理);8)性能优化建议和常见陷阱。通过丰富的代码示例,展示了QRect在Qt图形编程中的实际应用,帮助开发者掌握矩形处理的各项操作技巧,提升图形界面开发效率。

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 117

算法设计一:分而治之

分而治之解决问题思路: 分解原问题 :原问题分解成多个子问题 解决子问题 :递归地求解各个子问题 合并问题解 :将结果合并为原问题解 1. 归并排序 思路 归并排序:分解数组,递归求解,合并排序 **分解原问题:**将数组A[1,n]分解成A[1,n/2]和A[n/2+1,n]子数组排序问题 **解决子问题:**递归解决子问题得到有序的子数组 合并问题解:最后合并成有序的数组 实现 伪代码+Java 伪代码: Java代码实现: 时间复杂度为????(???? ??????????

Zeroowt的博客 544

Orin 10G PHY网络分析

由于调试用的10G PHY,所以整理下分析过程; 1.从Orin devkit 丝印来看RJ45 对应J17 通过搜索 MGBE_PHY_A_N 找到连接的10G PHY, 原理图上标明了MDIO address 为0x0, 使用的PHY 芯片为 Marvel 的AQR113C, 主要特性: 架构: 关键特征: MDC 连接了GPIO26_XFI0_MDC; MDIO 连接了GPIO25_XFI0_MDIO; 通过pinmux_config映射表也可以..

乐于分享 5654

RK3588平台开发系列讲解(以太网篇)MDIO底层驱动

沉淀、分享、成长,让自己和他人都能有所收获!😄。

内核笔记 6885

【贪心算法】最优服务次序问题

算法实现题 4-6最优服务次序问题 设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n个顾客等待直到完成服务的时间总和除以n。 对于给定的n个顾客需要的服务时间,编程计算最优服务次序。 Input 测试数据第一行是正整数n(n<=1000),表示有n个顾客。接下来的1行中,有n个正整数,表示n个顾客需要的服务时间ti(ti<=1000)。 Output 输出最小平均等待时间,每个答案一行,保留2位小数。.

WR的博客 1万+

uniapp - 微信支付报错 requestPayment:fail:HBuilder mainifest.json中配置的支付appid和生成订单使用的appid不一致,如果是HB调试请在线打包

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,微信支付,报错,errMsg,requestPayment:fail:HBuildermainifest.json中配置的支付appid和生成订单使用的appid不一致,如果是HB调试请在线打包,http://ask.dcloud.net.cn/article/282,已经都检查了还是报错,如何解决这个问题,还是不行,错误,苹果微信支付报错,安卓app微信支付出错,打包,在线打包也不行,本地打包,支

🏆 前端领域优质创作者 3500

次序选择问题 java代码完整实现 分治法

什么是次序选择: 就是需要找出给定序列中第k小元素(其中k大1小于n)。 比如当k=3时,我们需要找出该序列中第三小元素。 分治法解决次序选择问题: 我们可以借用随机主元的快速排序的思维去解决该问题(点击查看本人另一篇博文随机化快速排序:随机化快速排序),与快速排序不同的是,在主元下标等于k时,我们就可以直接退出,不需要再进行剩下的分解问题和合并问题解过程。其时间复杂度的数学期望为O(n),是一个非常高效的算法。 比如我们要寻找第4小元素,给定数组为945721683,下面我们对其进行分析: 开始——&gt

MrYushiwen的博客 2148

开源3D激光SLAM算法的异同点、优劣势与适配场景总结

本文对比分析了主流开源3D激光SLAM方案的核心差异与适用场景。LOAM架构简洁但精度较低;LeGO-LOAM轻量化适合地面机器人;LIO-SAM采用因子图优化支持多传感器融合;LVI-SAM通过视觉-激光-惯性三重冗余提升鲁棒性;FAST-LIO系列基于滤波架构实现超高实时性。选型需权衡传感器配置(纯激光/激光+IMU/激光+视觉)、运动状态(高速/常规)、计算资源等因素:资源受限选LeGO-LOAM或Faster-LIO,高速运动选FAST-LIO系列,退化环境选LVI-SAM,全局一致性需求选LIO-

Studying…… 651

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

分治思想的快速排序——次序选择问题

讲解次序查找问题,穿插快速排序和合并排序利用分治思想

MYNFR的博客 824

深度学习工具包 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")

最优服务次序问题

最优服务次序问题 一、问题描述: 设有n 个顾客同时等待一项服务。顾客i需要的服务时间为ti, 1≦i ≦n 。共有s处可以提供此服务。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n 个顾客等待服务时间的总和除以n。 二、贪心选择策略 假设原问题为T,而我们已经知道了某个最优服务系列,即最优解为A={t(1),t(2),….t(n)}(其中t(i)为第i个用户需

I Have A Dream 2391

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

最优服务次序C语言,最优服务次序问题 和 汽车加油问题

1.最优服务次序问题问题描述:设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti,1≦i≦n。共有s处可以提供此服务。应如何安排n个顾客的服务次序才能使平均等待时间达到最小平均等待时间是n个顾客等待服务时间的总和除以n。算法设计:对于给定的n个顾客需要的服务时间,计算最优服务次序。数据输入:由文件input.txt给出输入数据。第一行是正整数n,表示有n个顾客。接下来的1行中,有n...

weixin_29817791的博客 1336

学习贪心算法之最优服务次序问题

最优服务次序问题 一、问题描述:     设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti, 1≦i ≦n 。共有s处可以提供此服务。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n 个顾客等待服务时间的总和除以n。 二、贪心选择策略  假设原问题为T(先假设只有一个服务点),而我们已经知道了某个最优服务系列,即最优解为  A={t(1),t(2)

qq_33859629的博客 2429

多处最优服务次序问题(C语言)--贪心策略

多处最优服务次序问题 题目描述 设有n个顾客同时等待一项服务,顾客i需要的服务时间为ti,1≤i≤n,共有s处可以提供此项服务。应如何安排n个顾客的服务次序才能使平均等待时间达到最小? 平均等待时间是n个顾客等待服务时间的总和除以n。 解题思路 假设原问题为T(先假设只有一个服务点),而我们已经知道了某个最优服务系列,即最优解为A={t(1),t(2),….t(n)}(其中t(i)为第i个用户需要...

一个巨大的博客 1万+

《算法王晓东》多处最优服务次序问题

设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti, 1≤i≤n。共有s处可以提供此项服务。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。算法设计:对于给定的n个顾客需要的服务时间和s的值,计算最优服务次序。

m0_51376859的博客 1057
上一篇: 《算法之美》---快速排序(随机快速排序)
下一篇: 《ASCE1885的IT笔试面试题》---0000 0004
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值