【转】算法导论学习笔记 一 分治算法

分治策略是一种常见的算法。在分治策略中,我们递归的求解一个问题,在每层递归中应用如下三个步骤: 1. 分解,将问题分解成规模更小但解决方案相同的子问题 2. 解决,递归的求解子问题,如果子问题足够小则停止递归,直接求解 3. 合并,将子问题的解组合成原问题的解

最大字数组问题

给你一段股市的波动图,找到在什么时候买入,什么时候卖出能获得最大的收益。

 

暴力破解法

我们很容易的想到一个包里破解法,就是把所有买入,卖出的组合列举出来进行对比,n天中取任意两天作为买入日和卖出日,共有n*(n-1)/2种解法,因此这种解法的时间复杂度是O(n^2)。

问题变换

为了方便我们处理,我们把每个数组的值变为股票的净增量。这个时候,最佳解法就变成了求一个数组的最大字数组:

 

使用分治策略的求解法

我们可以认为,我们要寻找子数组array[start,end]的最大字数组分三种情况:

  • 最大字数组在左半部分
  • 最大字数组在右半部分
  • 最大字数组起点在左半部分,终点在右半部分

对于前两种情况,我们的求解方式和分解前是相同的,我们需要单独处理第三种情况。

如图:

 

那么我们给出解这个问题的思路:

FindMaxCrossingSubArray(array,start,end)mid=(start+end)/2从mid开始向左找,找到以mid为终点的最大字数组为array[max-left,min]从mid开始向右找,找到以mid为起点的最大字数组array[min,max-right]跨越mid的最大字数组为array[max-left,max-right]max-leftchild =FindMaxCrossingSubArray(array,start,mid)max-rightchild =FindMaxCrossingSubArray(array,min,end)return max-leftchild,max-rightchild,array[max-left,max-right] 3个中的最大字数组

分治算法分析

这种方法我们需要遍历的次数会比n^2少一些,时间复杂度为O(nlgn)

代码实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

public int[] FindRecrusive(int[] array, int low, int high)

{

    Console.WriteLine("low {0}, high {1}", low, high);

 

    if (low == high)

    {

        return new[] { low, high, array[low] };

    }

    int mid = (low + high) / 2;

 

    int leftmaxsum = int.MinValue;

    int currentleftsum = 0;

    int leftmaxlocation = mid;

 

    for (int i = mid; i >= low; i--)

    {

        currentleftsum += array[i];

        if (currentleftsum > leftmaxsum)

        {

            leftmaxsum = currentleftsum;

            leftmaxlocation = i;

        }

    }

 

    int rightmaxsum = 0;

    int currentrightsum = 0;

    int rightmaxlocation = mid;

 

    for (int j = mid + 1; j <= high; j++)

    {

        currentrightsum += array[j];

        if (currentrightsum > rightmaxsum)

        {

            rightmaxsum = currentrightsum;

            rightmaxlocation = j;

        }

    }

 

    int[] result = new[] { leftmaxlocation, rightmaxlocation, leftmaxsum + rightmaxsum };

 

    int[] leftresult = FindRecrusive(array, 0, mid);

 

    if (leftresult[2] > result[2])

    {

        result = leftresult;

    }

 

    int[] rightresult = FindRecrusive(array, mid + 1, high);

    if (rightresult[2] > result[2])

    {

        result = rightresult;

    }

 

    return result;

}

  

自己尝试用C#实现了下,托管在了github上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 对话框白色样式,Android 对话框(Dialog)样式大全以及简单实现

下面是几种对话框的效果图一&#xff1a;图二&#xff1a;图三&#xff1a;图四&#xff1a;图五&#xff1a;图六&#xff1a;图七&#xff1a;图1效果&#xff1a;该效果是当按返回按钮时弹出一个提示&#xff0c;来确保无误操作&#xff0c;采用常见的对话框样式。代码&…

【转】ABP源码分析二十一:Feature

Feature是什么&#xff1f;Feature就是对function分类的方法&#xff0c;其与function的关系就比如Role和User的关系一样。 ABP中Feature具有以下属性&#xff1a; 其中最重要的属性是name&#xff0c;用以表示feature的Identity,一个feature拥有一个name. 一个Feature可以有一…

巧克力情歌手---McKnight, Brian

巧克力情歌手&#xff0d;&#xff0d;&#xff0d;McKnight, Brian McKnight, Brian 1969年6月5日出生于美国纽约州的布法罗。Brian McKnight的哥哥Claude V. McKnight是福音音乐组Take 6的成员&#xff0c;Brian McKnight则是一名蓝调音乐歌手&#xff0c;他首先在布法罗及周…

android虚拟电话号码,为何安卓手机坚持虚拟按键?这才是原因

关于屏内虚拟按键设计的好坏&#xff0c;一直都存在很大的争议。围绕着屏内虚拟按键&#xff0c;支持者与反对者之间进行了长期的争论&#xff0c;至今仍未分出胜负。然而&#xff0c;当多功能前置指纹按键开始普及的时候&#xff0c;屏内虚拟按键似乎正在逐步走向边缘化。不过…

【转】ABP源码分析二十二:Navigation

MenuDefinition&#xff1a;封装了导航栏上的主菜单的属性。 MenuItemDefinition&#xff1a;封装了主菜单的子菜单的属性。子菜单可以引用其他子菜单构成一个菜单树 UserMenu/UserMenuItem&#xff1a;封装了用于显示给用户的菜单/以及子菜单集合。 ABP通过MenuDefinition/Me…

数据库调优都涉及哪些方面

面试时&#xff0c;经常被问及 “数据库调优”的事情&#xff0c;心想这不是DBA的事吗&#xff0c;但回答不好还是显得不够专业&#xff0c;查一下资料&#xff0c;许多还真是程序员的事情&#xff0c;下面总结一下&#xff0c;希望对大家有所帮助。方面以影响程度排序 D1 业务…

node.js android 聊天,Node.js实现简单聊天服务器

使用Nodejs是如此简单的实现了一个简单的聊天服务器实现代码如下&#xff1a;var net require(net);var chatServer net.createServer(),clientList [];chatServer.on("connection",function(client){client.name client.remoteAddress ":" client.r…

【转】ABP源码分析二十三:Authorization

Permission&#xff1a;用于定义一个Permission&#xff0c;一个permission可以包含多个子Permission. PermissionDictionary&#xff1a;继承自Dictionary<string, Permission>类&#xff0c;很明显是一个用于存储permission对象的字典。 IPermissionDefinitionContext…

VI/VIM键盘图

转载于:https://www.cnblogs.com/sdjc/archive/2006/09/14/1949532.html

android确认密码代码,Android手机卫士之确认密码对话框

本文接着实现“确认密码”功能&#xff0c;也即是用户以前设置过密码&#xff0c;现在只需要输入确认密码布局文件和《Android 手机卫士--设置密码对话框》中的布局基本类似&#xff0c;所有copy一下&#xff0c;修改一点细节就搞定&#xff1a;android:layout_width"matc…

修改MD5加密 提高网站安全

发表文章 修改MD5加密 提高网站安全2006-08-28 16:23:55大 中 小特别说明&#xff1a;此种改变只能用于在刚开始建站时才可&#xff0c;如果你中途改变的话就会出现问题。   也许提到MD5时大家都很熟&#xff0c;但你真的是这样吗&#xff1f;了解其是如何进行散列的实际过…

【转】ABP源码分析二十四:Notification

NotificationDefinition: 用于封装Notification Definnition 的信息。注意和Notification 的区别&#xff0c;如果把Notification看成是具体的消息内容&#xff0c;NotificationDefinition则是对这个消息自身的定义&#xff08;可理解为消息的类型&#xff09;。 INotification…

一剪梅

红藕香残玉簟秋。轻解罗裳&#xff0c;独上兰舟。 云中谁寄锦书来&#xff1f;雁字回时&#xff0c;月满西楼。 花自飘零水自流。一种相思&#xff0c;两处闲愁。 此情无计可消除&#xff0c;才下眉头&#xff0c;却上心头。转载于:https://www.cnblogs.com/daitengfei/archive…

android手机 scala环境,在Android中使用Scala中的Java常量

我在Android上的Scala中开发了一个奇怪的问题。我正在使用sbt android插件&#xff0c;现在我正在尝试让内容提供商工作&#xff0c;但是...在Android中使用Scala中的Java常量刚刚用Scala替换了Java的数组代码。它看起来像这样&#xff1a;val projection Array(People.NAME,P…

【转】ABP源码分析二十五:EventBus

IEventData/EventData: 封装了EventData信息&#xff0c;触发event的源对象和时间 IEventBus/EventBus: 定义和实现了了一系列注册&#xff0c;注销和触发事件处理函数的方法。EventBus定义了一个Dictionary容器来存放事件和处理该事件的对象(其实不是对象而是Factory&#xf…

深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET调用Web Services方法...

在之前的例子里&#xff0c;由于Atlas客户端在调用Web Services方法时总是使用了Sys.Net.ServiceMethod类&#xff0c;因此始终使用了HTTP POST方法与服务器端进行交互。POST方法有其好处&#xff0c;不过GET方法也自有其价值。我们在使用Atlas进行Web Services调用时&#xff…

【转】ABP源码分析二十六:核心框架中的一些其他功能

本文是ABP核心项目源码分析的最后一篇&#xff0c;介绍一些前面遗漏的功能 AbpSession AbpSession: 目前这个和CLR的Session没有什么直接的联系。当然可以自定义的去实现IAbpSession使之与CLR的Session关联 IAbpSession&#xff1a;定义如下图中的四个属性。 NullAbpSessio…

CASE 语句

--简单case函数 USE pubsGOSELECT Category CASE type WHEN popular_comp THEN 计算机类 WHEN mod_cook THEN 现代厨艺 WHEN business THEN 商业图书 WHEN psychology THEN 心理学 WHEN trad_cook THEN 传统厨艺 ELS…

【转】ABP源码分析二十七:ABP.Entity Framework

IRepository&#xff1a;接口定义了Repository常见的方法 AbpRepositoryBase&#xff1a;实现了IRepository接口的常见方法 EfRepositoryBase:实现了AbpRepositoryBase中定义的抽象方法&#xff1a;GetAll&#xff0c;Insert&#xff0c;Delete&#xff0c;Update。在实际项目…

泛型实现List(ListT)排序

代码 publicclassPost : IComparable<Post>{ privatestringid string.Empty; privatestringtitle string.Empty; privateintorderby; publicstringID { get{ returnid; } set{ id value; } } pu…