zoukankan      html  css  js  c++  java
  • 算法

    小和问题

    在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和称为小和问题。

    input: [2,4,5,1,7,3]
    2 左侧比 2 小的数,没有;
    4 左侧比 4 小的数,2;
    5 左侧比 5 小的数,2,4;
    1 左侧比 1 小的数,没有;
    7 左侧比 7 小的数,2,4,5,1;
    3 左侧比 3 小的数,2,1。
    
    output: 2+2+4+2+4+5+1+2+1=23
    

    此处使用归并排序,在 merge 时,由于左右两部分都已经有序,可以确定一侧的数都大于正在比较的数,例如:

    归并 2 4 5 | 1 3 7 两个部分时,2 比 3 小,此时可以确定后面的数都大于 2,此时便可以一次性计算小和 2 * 2(两个数大于 2),而不用一个个遍历。
    

    总结

    使用归并排序算法的快速之处在于,归并的两个部分对内都是有序的,如 2 4 5 | 1 3 7 两个部分。因此在比较大小的时候,可以迅速确定整批的数据大小,而不用重复遍历计算。

    又由于每一次 merge 的数据都是新的,此前没有重复算过,因此不会多次计算或漏算。

    逆序对问题

    在一个数组中,左边的数如果比右边的数大,则这两个数构成一个逆序对。

    这个问题也适合使用归并排序的方法进行批量计算,例如

    仍然以 2 4 5 | 1 3 7 数据举例,因为
    2 4 5 | 1 3 7
    ↑       ↑
    此时 (2,1) 组成逆序对,因此 (4,1) (5,1) 逆序对也可以直接推导出来
    

    使用这种计算有效的利用了归并排序 merge 过程中,两部分数据有序的特征,使得大大加快比较的速度。

  • 相关阅读:
    关闭窗体后,利用StreamWriter保存控件里面的数据
    ref传递
    C# 特性 Attribute
    关键字 new 的作用
    关键字 base 的作用
    关键字 this 的作用
    random类的使用
    数据库结果为 基于左右值排序的无限分类算法
    PHP显示日期、周几、农历初几、什么节日函数编程代码
    描述了say_hello函数的具体内容,调用zend_printf系统函数在php中打印字符串
  • 原文地址:https://www.cnblogs.com/chenxianbin/p/11882092.html
Copyright © 2011-2022 走看看