精华内容
参与话题
问答
  • c++经典代码大全 清晰版

    千次下载 热门讨论 2011-12-06 13:28:30
    c++经典代码大全 适合C++新手看的经典代码!!!
  • 本博文是笔者的2019年度规划,我将用1年的时间掌握22本国外经典计算机类著作(将近1.2万页的内容) 教材说明 这些教材有如下特点: 这20本著作绝大部分是麻省理工大学的指定教材,要么就是斯坦福大学的指定教材...

     

    目录

    教材说明

    计划细则

    22本经典教材详细介绍及学习时间安排

     


    本博文是笔者的2019年度规划,我将用1年的时间掌握22本国外经典计算机类著作(将近1.2万页的内容)

     

    教材说明

    这些教材有如下特点:

    • 这20本著作绝大部分是麻省理工大学的指定教材,要么就是斯坦福大学的指定教材。
    • 教材的作者均为美国一流计算机科学家,要么是图灵奖获得者,要么是美国科学院院士。
    • 每本教材的难度系数均为同领域课程最难或最深入级别。
    • 每本教材的内容容量相当于高校2个学期课程,(相当于5-6学分)

     

    计划细则:

    1. 直播通告:
      1. 本年度我学习教材的偶数小节我都会录制视频分析讲解课本内容上传至B站(B站搜:月下卓)。
      2. 2019年至少直播1500小时学习这22本经典巨著。
    2. 本计划和2年学完6个清华CS类硕士学位计划并行。本计划实际上为主宰力量系列计划的具体落地版本(主宰力量系列计划见:https://blog.csdn.net/weixin_43314012/article/details/83433816
    3. 我对本次年度计划给予最高级别关注的,本计划优先级高于一切,不计代价必须完成!!本年度我所有的每日学习反思均会加上日期“1年掌握22本国外最经典计算机类巨著第XX天”。
    4. 目前学习基础:因为本人非科班出身,故本年度的85%的主题(操作系统、编译原理、编译器、自动机与形式语言、组合数学),我之前没有学过。。
    5. 所有教材均给出固定的学习时间期限,(基本上)我会严格按照计划事先制定好的次序进行学习。
    6. 【本年度计划难度评估】:逆天级。(我一直很好奇爱因斯坦一年能掌握几本。。)
    7. 【本年度计划体量评估】:本年度学习内容量等价于985高校4年的学习量,折合学分90~110学分。

    2019年度我学习的专题包括:
    高级操作系统,高等编译原理,高级编译器设计与实现,高等数据库原理,高级数据库设计与实现,高级计算机网络,高级算法设计与分析,高等理论计算机科学,高等计算机体系结构,组合数学,近世代数

    2020年度我学习的主题主要包括
    高级并行计算,高级计算机图形学,网络安全,高级软件工程(7个子课程),大数据与人工智能主题(5个子课程),网络空间安全主题(6个子课程),高级搜索引擎

     


     

    22本经典教材详细介绍及学习时间安排

     

    2019年1.10~1.30号  算法导论(已完成)

    教材名:算法导论

    教材图:

    教材介绍:作者是图灵奖得主,本书是计算机领域三大圣经之一。

     

    2019年.2.5~2.16号   春节休闲读物之SICP

     

    教材名:计算机程序的构造和解释【SICP】(473页)【11天掌握】
    教材图:
    教材介绍:《计算机程序的构造和解释(原书第2版)》1984年出版,成型于美国麻省理工学院(MIT)多年使用的一本教材,
    可能会参考的清华对应课程。

    对应课程:麻省理工6001课程


    2019.2.23~3.25   数学专题学习

    教材名:组合数学【371页】【9天掌握】

    教材图:

    教材介绍:本书是麻省理工教材,出版三十多年来多次改版,被MIT、哥伦比亚大学、UIUC、威斯康星大学等众多国外高校采用,对国内外组合数学教学产生了较大影响,也是相关学科的主要参考文献之一。

    可能参考的清华课程:60240013-组合数学

    参考教材:《组合数学-清华大学-卢华明》

     

     

    教材名:具体数学(562页)【20天掌握】
    教材图:
    教材介绍:作者-Ronald L. Graham 美国数学学会主席。作者-Donald E. Knuth(高德纳) 图灵奖得主
    可能会参考的清华对应课程:60420153 工程硕士数学

     

     

    2019.4.1~6.15  给比尔盖茨发简历计划(TAOCP四卷)  

     

    教材名:程序设计与艺术 TAOCP 3卷(3000页)【70天掌握】
    教材图:
    教材介绍:比尔盖茨说,读懂这套书的人可以给他发简历。这套书是计算机领域最难最经典的书。被选为20世纪最重要的12部科学著作(与爱因斯坦相对论齐名)。作者是图灵奖得主高德纳,高德纳因为完成了这套书而获得图灵奖。

     

     

    2019/6/18~7/13  计算机体系结构+面向对象编程

    教材名:深入理解计算机系统CSAPP(737页)【11天掌握】
    教材图:
    教材介绍:作者Randal E. Bryant美国工程院院士,卡内基梅隆大学计算机院院长,本教材是卡内基梅隆大学的教材。
    对应课程:卡内基梅隆大学 计算机体系结构
     

     

    教材名:Java编程思想(880页)【13天掌握本书70%内容】
    教材图:


    教材介绍:作者C++标准委员会成员
     

    2019/7/14~8/10  高等计算机理论学习

    教材名:计算理论导引(269页)【10天掌握】
    教材图:
    教材介绍:本书是计算理论领域的经典著作,被国外多所大学选用为教材。本书以注重思路、深入引导为特色,系统地介绍计算理论的三大主要内容:自动机与语言、可计算性理论和计算复杂性理论。同时,对可计算性和计算复杂性理论中的某些高级内容作了重点讲解。全书通过启发性的问题、精彩的结果和待解决问题来引导读者挑战此领域中的高层次问题。新版的一大亮点是增加了更多习题、教辅资料和部分习题解答,更加有利于教学。
    可能会参考的清华对应课程:80240434-高等理论计算机科学上

     

     

    教材名:自动机理论、语言和计算导论(366页)【12天掌握】
    教材图:
    教材介绍:本书是清华和斯坦福大学使用的教材
    清华对应课程:形式语言与自动机

     

    2019/8/12~2019/9/22  高级编译器专题

    教材名:龙书-编译原理(631页)【20天掌握】
    教材图:
    教材介绍:大名鼎鼎的龙书,斯坦福编译原理用这本教材。编译原理领域最权威教材,作者Alfred是美国国家工程院院士,作者Sethi是贝尔实验室的高级副总裁。
    可能会参考的清华对应课程:70240342-高级编译与优化技术

     

     

    教材名:高级编译器设计与实现(624页)【17天掌握】

    教材图:

    教材介绍:大名鼎鼎的鲸书,与龙书齐名。本书涵盖了现代微处理器编译器的设计和实现方面的所有高级主题。

     

    2019/9/25~2019/10/15 高级操作系统专题

    教材名:现代操作系统(582页)【15天掌握】
    教材图:
    教材介绍:作者是荷兰科学院院士,是Linux、Windows Vista和Symbian操作系统的设计师。本书是操作系统领域最经典书籍。
    可能会参考的清华对应课程:80240442-高级操作系统

    教材名:30天自制操作系统【704页】【10天掌握】

    教材图:

    教材介绍:完整实现一个功能全面的操作系统

     

    2019/10/15~2019/11/22  高级计算机网络专题(如果穿插unix网络编程的学习,那么还要多加15天的时间)

    教材名:TCP/IP详解 三卷(1500页)【28天掌握】
    教材图:
    教材介绍:作者W.Richard Stevens被USENIX追授“终身成就奖”。本书是计算机网络领域最权威之书,毕竟作者是网络之神。
    可能会参考的清华对应课程:60240083-高等计算机网络  80240333-无线网络和移动计算

     

     

    2019/11/22~2020/1/22 高级数据库专题

     

    教材名:数据库系统概念(805页)【18天掌握】
    教材图:
    教材介绍:数据库领域最权威教材,斯坦福大学数据库第一阶段教材
    可能会参考的清华对应课程:70248013-数据库系统设计与原理

     

    教材名:数据库系统实现(385页)【12天掌握】
    教材图:
    教材介绍:斯坦福大学数据库第二阶段教材
    可能会参考的清华对应课程:工程数据库设计与应用-70240213
     

    2020/1/22~2020/2/10 高级计算机体系结构专题

    教材名:计算机体系结构-量化研究方法【600页】【13天掌握】

    教材图:

    教材介绍:本书是计算机体系结构圣经,作者是斯坦福校长,本书是北大高等计算机体系结构教材

     

     

     

     

    展开全文
  • 经典

    2013-02-26 15:23:00
    我能抽象出整个世界... 但是我不能抽象出你... 因为你在我心中是那么的具体... 所以我的世界并不完整... 我可以重载甚至覆盖这个世界里的任何一种方法... 但是我却不能重载对你的思念......


    我能抽象出整个世界...
    但是我不能抽象出你...
    因为你在我心中是那么的具体...
    所以我的世界并不完整...
    我可以重载甚至覆盖这个世界里的任何一种方法...
    但是我却不能重载对你的思念...
    也许命中注定了 你在我的世界里永远的烙上了静态的属性...
    而我不慎调用了爱你这个方法...
    当我义无返顾的把自己作为参数传进这个方法时...
    我才发现爱上你是一个死循环...
    它不停的返回对你的思念压入我心里的堆栈...
    在这无尽的黑夜中...
    我的内存里已经再也装不下别人...
    我不停的向系统申请空间...
    但却捕获一个异常---我爱的人不爱我...
    为了解决这个异常...
    我愿意虚拟出最后一点内存...
    把所有我能实现的方法地址压入堆栈...
    并且在栈尾压入最后一个方法---将字符串"我爱你,你爱我吗?"传递给你...
    如果返回值为真--我将用尽一生去爱你...
    否则--我将释放掉所有系统资源

    展开全文
  • 经典_STM32_ADC多通道采样

    千次阅读 2017-07-26 22:21:24
    转载的STM32 ADC多通道采集 程序代码存在部分错误,但思路可用 另外这个函数库应该是V2.0或V1.8的 可作为学习参考用 ...描述:用ADC连续采集11路模拟信号,并由DMA传输到内存。ADC配置为扫描并且连续转换模式,ADC的...

    转载的STM32 ADC多通道采集 程序代码存在部分错误,但思路可用 另外这个函数库应该是V2.0或V1.8的 可作为学习参考用
    并推荐网址:http://blog.csdn.net/devintt/article/details/46997985
    http://blog.csdn.net/qq_27312943/article/details/51380987(库函数配置说明讲得详细)

    STM32 ADC多通道转换
    描述:用ADC连续采集11路模拟信号,并由DMA传输到内存。ADC配置为扫描并且连续转换模式,ADC的时钟配置为12MHZ。在每次转换结束后,由DMA循环将转换的数据传输到内存中。ADC可以连续采集N次求平均值。最后通过串口传输出最后转换的结果。
    程序如下:

    #i nclude "stm32f10x.h" //这个头文件包括STM32F10x所有外围寄存器、位、内存映射的定义
    #i nclude "eval.h" //头文件(包括串口、按键、LED的函数声明)
    #i nclude "SysTickDelay.h"
    #i nclude "UART_INTERFACE.h"
    #i nclude 
    
    #define N 50 //每通道采50次
    #define M 12 //为12个通道
    
    vu16 AD_Value[N][M]; //用来存放ADC转换结果,也是DMA的目标地址
    vu16 After_filter[M]; //用来存放求平均值之后的结果
    int i;
    
    
    
    void GPIO_Configuration(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //因为USART1管脚是以复用的形式接到GPIO口上的,所以使用复用推挽式输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    
    
    //PA0/1/2 作为模拟通道输入引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    //PB0/1 作为模拟通道输入引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    //PC0/1/2/3/4/5 作为模拟通道输入引脚
    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    }
    
    }
    
    
    void RCC_Configuration(void)
    {
    ErrorStatus HSEStartUpStatus;
    
    RCC_DeInit(); //RCC 系统复位
    RCC_HSEConfig(RCC_HSE_ON); //开启HSE
    HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE准备好
    if(HSEStartUpStatus == SUCCESS)
    {
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer
    FLASH_SetLatency(FLASH_Latency_2); //Set 2 Latency cycles
    RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB clock = SYSCLK
    RCC_PCLK2Config(RCC_HCLK_Div1); //APB2 clock = HCLK
    RCC_PCLK1Config(RCC_HCLK_Div2); //APB1 clock = HCLK/2
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6); //PLLCLK = 12MHz * 6 = 72MHz
    RCC_PLLCmd(ENABLE); //Enable PLL
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLL is ready
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock source
    while(RCC_GetSYSCLKSource() != 0x08); //Wait till PLL is used as system clocksource
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB
    | RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1, ENABLE ); //使能ADC1通道时钟,各个管脚时钟
    
    RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC最大时间不能超过14M
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输
    
    }
    }
    
    
    void ADC1_Configuration(void)
    {
    ADC_InitTypeDef ADC_InitStructure;
    
    ADC_DeInit(ADC1); //将外设 ADC1 的全部寄存器重设为缺省值
    
    
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
    ADC_InitStructure.ADC_ScanConvMode =ENABLE; //模数转换工作在扫描模式
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //模数转换工作在连续转换模式
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //外部触发转换关闭
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
    ADC_InitStructure.ADC_NbrOfChannel = M; //顺序进行规则转换的ADC通道的数目
    ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
    
    
    //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
    //ADC1,ADC通道x,规则采样顺序值为y,采样时间为239.5周期
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 5, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 6, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 7, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 8, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 9, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 10, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 11, ADC_SampleTime_239Cycles5 );
    ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 12, ADC_SampleTime_239Cycles5 );
    
    // 开启ADC的DMA支持(要实现DMA功能,还需独立配置DMA通道等参数)
    ADC_DMACmd(ADC1, ENABLE);
    
    ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
    
    ADC_ResetCalibration(ADC1); //复位指定的ADC1的校准寄存器
    
    while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC1复位校准寄存器的状态,设置状态则等待
    
    
    ADC_StartCalibration(ADC1); //开始指定ADC1的校准状态
    
    while(ADC_GetCalibrationStatus(ADC1)); //获取指定ADC1的校准程序,设置状态则等待
    
    
    }
    
    
    void DMA_Configuration(void)
    {
    
    DMA_InitTypeDef DMA_InitStructure;
    DMA_DeInit(DMA1_Channel1); //将DMA的通道1寄存器重设为缺省值
    DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)&ADC1->DR; //DMA外设ADC基地址,***一定不要丢失取地址符号“&”,否则出现乱码***
    DMA_InitStructure.DMA_MemoryBaseAddr =(u32)&AD_Value; //DMA内存基地址,***一定不要丢失取地址符号“&”,否则出现乱码***
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//内存作为数据传输的目的地
    DMA_InitStructure.DMA_BufferSize = N*M; //DMA通道的DMA缓存的大小
    DMA_InitStructure.DMA_PeripheralInc =DMA_PeripheralInc_Disable; //外设地址寄存器不变
    DMA_InitStructure.DMA_MemoryInc =DMA_MemoryInc_Enable; //内存地址寄存器递增
    DMA_InitStructure.DMA_PeripheralDataSize =DMA_PeripheralDataSize_HalfWord; //数据宽度为16位
    DMA_InitStructure.DMA_MemoryDataSize =DMA_MemoryDataSize_HalfWord; //数据宽度为16位
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循环缓存模式
    DMA_InitStructure.DMA_Priority =DMA_Priority_High; //DMA通道 x拥有高优先级
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);//根据DMA_InitStruct中指定的参数初始化DMA的通道
    
    }
    
    
    //配置所有外设
    void Init_All_Periph(void)
    {
    
    RCC_Configuration();
    
    GPIO_Configuration();
    
    ADC1_Configuration();
    
    DMA_Configuration();
    
    //USART1_Configuration();
    USART_Configuration(9600);
    
    
    }
    
    
    
    u16 GetVolt(u16 advalue)
    
    {
    
    return (u16)(advalue * 330 / 4096); //求的结果扩大了100倍,方便下面求出小数
    
    }
    
    
    
    
    void filter(void)
    {
    int sum = 0;
    u8 count;
    for(i=0;i<M;i++)
    
    {
    
    for ( count=0;count<N;count++)
    
    {
    
    sum += AD_Value[count][i];
    
    }
    
    After_filter[i]=sum/N;
    
    sum=0;
    }
    
    }
    
    
    
    
    int main(void)
    {
    
    u16 value[M];
    
    init_All_Periph();
    SysTick_Initaize();
    
    
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    DMA_Cmd(DMA1_Channel1, ENABLE); //启动DMA通道
    while(1)
    {
    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待传输完成否则第一位数据容易丢失
    
    filter();
    for(i=0;i<12;i++)
    {
    value[i]= GetVolt(After_filter[i]);
    
    printf("value[%d]:t%d.%dvn",i,value[i]/100,value[i]/10) ;
    delay_ms(100);
    }
    }
    
    }

    总结
    该程序中的两个宏定义,M和N,分别代表有多少个通道,每个通道转换多少次,可以修改其值。
    曾出现的问题:配置时钟时要知道外部晶振是多少,以便准确配置时钟。将转换值由二进制转换为十进制时,要先扩大100倍,方便显示小数。最后串口输出时在 printf语句之前加这句代码,防止输出的第一位数据丢失:while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

    展开全文
  • 首先,本博客为原创作品,欢迎指导,随意转载,如果可以请转载时说明出处,附上...动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题...

    首先,本博客为原创作品,欢迎指导,随意转载,如果可以请转载时说明出处,附上本文链接(https://blog.csdn.net/ailaojie/article/details/83014821),谢谢
    原文链接
    动态规划的重要性就不多说,直接进入正题

    首先,我们看一下官方定义:
    定义:
    动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。
    动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。
    基本思想与策略编辑:
    由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。
    (来自百度百科)
    说实话,没有动态规划的基础很难看懂,但是也能从中看出一些信息,下面我翻译成人话:
    首先是拆分问题,我的理解就是根据问题的可能性把问题划分成一步一步这样就可以通过递推或者递归来实现.
    关键就是这个步骤,动态规划有一类问题就是从后往前推到,有时候我们很容易知道:如果只有一种情况时,最佳的选择应该怎么做.然后根据这个最佳选择往前一步推导,得到前一步的最佳选择
    然后就是定义问题状态和状态之间的关系,我的理解是前面拆分的步骤之间的关系,用一种量化的形式表现出来,类似于高中学的推导公式,因为这种式子很容易用程序写出来,也可以说对程序比较亲和(也就是最后所说的状态转移方程式)
    我们再来看定义的下面的两段,我的理解是比如我们找到最优解,我们应该讲最优解保存下来,为了往前推导时能够使用前一步的最优解,在这个过程中难免有一些相比于最优解差的解,此时我们应该放弃,只保存最优解,这样我们每一次都把最优解保存了下来,大大降低了时间复杂度

    说很难理解清楚,容易懵懵懂懂的,所以下面结合实例看一下(建议结合实例,纸上谈兵不太好):

    经典的数字三角形问题(简单易懂,经典动态规划);

    题目:题目描述
    输入格式
    可以看出每走第n行第m列时有两种后续:向下或者向右下
    由于最后一行可以确定,当做边界条件,所以我们自然而然想到递归求解
    解题思路:解题思路
    c语言答案
    下面简单写一下java代码:

    //java代码纯属自己练习,标准答案参考上面的c语言答案
    class solution{
    	public int getMax(){
    		int MAX = 101;
    		int[][] D = new int[MAX][MAX];   //存储数字三角形
    		int n;              //n表示层数
    		int i = 0; int j = 0;
    		int maxSum = getMaxSum(D,n,i,j);
    		return maxSum;
    	}
    	public int getMaxSum(int[][] D,int n,int i,int j){
    		if(i == n){
    			return D[i][j];
    		}
    		int x = getMaxSum(D,n,i+1,j);
    		int y = getMaxSum(D,n,i+1,j+1);
    		return Math.max(x,y)+D[i][j];
    	}
    }
    

    其实仔细观察,上面的解答过程时间复杂度难以想象的大,那是因为他对有的数字的解进行了多次的重复计算,具体如下图:
    超时原因
    如果不明白上图,可以把每条路径都画出来,观察每个数字有多少条路径经过了他,就会一目了然
    然后我们就可以自然而然的想到,如果我们每次都把结果保存下来,复杂度就会大大降低
    改进方法
    其实答案很简单:改进解法
    其实这是动态规划很精髓的一部分,是减少复杂度的主要原因
    我们都知道,递归一般情况下是可以转化为递推的,不详细解释了,贴上答案:
    递推解法
    其实,仔细观察该解题过程,该过程就是标准的动态规划解题过程,如果把该过程画出来(找到每一步的最优解,其他的舍弃)对动态规划会有更深刻的解法
    还有就是,递推的另一个好处是可以进行空间优化,如图:
    空间优化
    下面总结一下动态规划的解题一般思路:
    首先递归应该是我们解决动态规划问题最常用的方法,帅,速度不算太慢
    那么递归到动规的一般转化方法为:
    如果该递归函数有n个参数,那么就定义一个n维数组,数组下标是递归函数参数的取值范围(也就是数组每一维的大小).数组元素的值就是递归函数的返回值(初始化为一个标志值,表明还未被填充),这样就可以从边界值开始逐步的填充数组,相当于计算递归函数的逆过程(这和前面所说的推导过程应该是相同的).
    原文链接:https://blog.csdn.net/ailaojie/article/details/83014821

    动规解题的一般思路(标准官方,不过经过前边讲解应该就能理解了):

    1. 将原问题分解为子问题(开头已经介绍了怎么分解) (注意:1,子问题与原问题形式相同或类似,只是问题规模变小了,从而变简单了; 2,子问题一旦求出就要保存下来,保证每个子问题只求解一遍)
    2. 确定状态(状态:在动规解题中,我们将和子问题相关的各个变量的一组取值,称之为一个"状态",一个状态对应一个或多个子问题所谓的在某个状态的值,这个就是状态所对应的子问题的解,所有状态的集合称为"状态空间".我的理解就是状态就是某个问题某组变量,状态空间就是该问题的所有组变量) 另外:整个问题的时间复杂度就是状态数目乘以每个状态所需要的时间
    3. 确定一些初始状态(边界条件)的值 (这个视情况而定,千万别以为就是最简单的那个子问题解,上面只是例子,真正实践动规千变万化)
    4. 确定状态转移方程 (这一步和第三步是最关键的 记住"人人为我"递推,由已知推未知)

    适合使用动规求解的问题:
    1,问题具有最优子结构
    2,无后效性 说的花里胡哨的,其实一般遇到求最优解问题一般适合使用动态规划

    部分参考资料出自:北大信科郭炜老师

    感觉自己洋洋洒洒写了几个小时,对动态规划有了一定的理解,也希望对你们有所帮助,动态规划千变万化,这仅仅是一个理解过程,我们还是应该多练习,共勉吧.转载的话,如果方便请加上转载地址,谢谢.

    展开全文
  • 经典算法

    2016-01-01 11:34:29
    十大算法等5大经典原创系列作品与一些重要文章的集锦: 一、微软面试100题系列 横空出世,席卷Csdn--评微软等数据结构+算法面试100题 (微软面试100题系列原题+答案索引)微软100题 (微软面试完整第1-100题)...
  • 十三个经典算法研究与总结、目录+索引

    万次阅读 多人点赞 2011-04-06 17:31:00
    十三个经典算法研究与总结、目录+索引「后续更新为十五个」 (PDF下载地址:http://download.csdn.net/detail/v_july_v/4478027)作者:July。时间:二零一零年十二月末-二零一一年四月初。出处:...
  • Java经典算法讲解

    万人学习 2015-05-01 04:13:33
    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法...
  • 本文主要分析皆来自其他资料,借用较为权威的总结来对我已经学习的这些经典算法做一个极为精简的概述(根据自身经验有一定修改),另外同时附上机器学习实战中作者对各种算法的评价。另外机器学习实战这本书是本人看...
  • 数据结构与算法中的经典算法

    万次阅读 多人点赞 2018-07-19 21:47:12
    数据结构与算法之经典算法 常见数据结构与算法整理总结(上) 常见数据结构与算法整理总结(下) 二、针对性参考 1) 排序 数据结构与算法之经典排序 2)二叉树 数据结构与算法之二叉树+遍历+哈夫曼树 ...
  • 计算机10大经典算法

    万次阅读 多人点赞 2018-06-08 13:42:58
    算法一:快速排序法   快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比...
  • 10大计算机经典算法

    万次阅读 多人点赞 2017-06-01 17:00:39
    算法一:快速排序法    快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常...
  • 五大经典算法总结

    千次阅读 2018-02-27 22:29:19
     在刷leetcode时经常看到有人说DP,然后去百度了DP是个啥,才知道DP是五大经典算法之一,今天开始总结一下五大经典算法。 五大经典算法分为1、分治法:把一个复杂的问题分成两个或更多的相同或相似的子问...
  • Python的100道经典算法题(错误百出被大家喷版本)

    万次阅读 热门讨论 2016-05-29 17:40:36
    按照c语言的100道经典算法题,自己原创写的,水平可能很低,就得是自己的练习题了
  • C++常用经典算法源码

    2018-12-01 15:00:42
    C++常用经典算法源码,包括高精度计算、数据排序、递推算法、递归算法、搜索与回溯算法、贪心算法、分治算法、广度优先搜索、动态规划等
  • 经典算法书籍推荐以及算法书排行【算法四库全书】 作者:霞落满天 https://linuxstyle.blog.csdn.net/ https://blog.csdn.net/21aspnet 行文方式:类似《四库全书》截取经典算法书目录和精华篇章 版权说明:本文...
  • 数据挖掘十大经典算法(详解)

    万次阅读 多人点赞 2014-04-23 16:51:25
    数据挖掘十大经典算法
  • C语言经典算法100例(一)

    万次阅读 多人点赞 2013-10-12 00:31:44
    C语言中有有许多经典算法,这些算法都是许多人的智慧结晶,也是编程中常用的算法,这里面包含了众多算法思想,掌握这些算法,对于学习更高级的、更难的算法都会有很大的帮助,会为自己的算法学习打下坚实的基础。...
  • 经典算法---冒泡排序

    万次阅读 多人点赞 2014-09-24 15:58:50
    原文链接: 冒泡排序---经典排序算法 | 逍遥游 冒泡排序(BubbleSort)以其“在排序过程中相邻元素不断交换,一些元素慢慢被换到最后,看起来就像是元素在冒泡一样”而得名,是一种简单的基于关键词比较的排序...
  • 十大经典算法

    千次阅读 2018-03-01 15:35:13
    第十名:Huffman coding(霍夫曼编码) 霍夫曼编码(Huffman Coding)是一种编码方式,是一种用于无损数据压缩的熵编码(权编码)算法。1952年,David A. Huffman在麻省理工攻读博士时所发明的,并发表于《一种构建极...
  • 经典算法大全】收集51种经典算法 初学者必备

    万次阅读 多人点赞 2018-05-03 12:35:02
    经典算法大全》是一款IOS平台的应用。里面收录了51种常用算法,都是一些基础问题。博主觊觎了好久,可悲哀的是博主没有苹果,所以从网上下了老奔的整理版并且每个都手敲了一遍。 虽然网上也有博客贴了出来,但是...
  • C语言经典算法大全

    2018-08-20 09:19:17
    C语言经典算法大全!!!强烈推荐!!里面包含了各种经典的算法及C语言代码实现
  • C语言经典算法100例.pdf

    千次下载 热门讨论 2010-09-10 19:34:52
    C语言经典算法100例.pdf 每一例都是一个精典,C语言学习的必备书。
  • 数据挖掘领域十大经典算法之—EM算法

    万次阅读 多人点赞 2018-03-08 14:53:25
    数据挖掘领域十大经典算法之—C4.5算法(超详细附代码) 数据挖掘领域十大经典算法之—K-Means算法(超详细附代码) 数据挖掘领域十大经典算法之—Apriori算法 数据挖掘领域十大经典算法之—EM算法 数据挖掘...
  • 精通图像处理经典算法MATLAB版

    热门讨论 2014-08-17 18:33:02
    MATLAB源程序,关于图像处理的一些经典算法,很不错的资源,个人学习受益很大,本着取之于民用之于民的想法,故分享之。
  • 数据结构十大经典算法(面试常问)

    千次阅读 多人点赞 2019-09-03 11:32:24
    数据结构十大经典算法一、算法的分类二、术语说明三、时间复杂度1、冒泡排序2、快速排序3、选择排序4、插入排序(Insertion Sort)5、希尔排序(Shell Sort)6、归并排序7、堆排序(Heap Sort)8、计数排序...
  • 大数据十大经典算法

    千次阅读 2017-01-11 17:16:35
    国际权威的学术组织the IEEE International Conference on Data Mining (ICDM) 2006年12月评选出了数据挖掘领域的十大经典算法:C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and ...
  • 计算机经典算法汇总

    千次阅读 2016-12-17 21:53:16
    《代码大全》 史蒂夫·迈克康奈尔 ...《算法导论》 《重构:改善既有代码的设计》 《设计模式》 《人月神话》 《计算机程序设计艺术》 《编译原理》(龙书) 《深入浅出设计模式》 《哥德
  • 模式识别中的十大经典算法,学习模式识别,图像处理的经典资料!
  • 经典算法书单

    千次阅读 2017-09-11 11:22:50
    图灵算法书单 2017-07-24 张敏,英子 图灵教育 算法书单 本书单涉及16本算书,按照算法的实现语言分类列出,TAOCP放到了后面。 Python ⊙《算法图解》 Java ⊙《算法(第4版)》【中英文版...

空空如也

1 2 3 4 5 ... 20
收藏数 846,678
精华内容 338,671
关键字:

经典