22.1.7 master公式及O(NLogN)的排序

1 master 公式

(1) 写公式
  • T(N) = a * T(N/b) + O(N^d);

  • master公式用来求递归行为的时间复杂度,式中T(N/b)表示母问题被分解为子问题的规模,a表示子问题被调用的次数,O(N^d)表示算法中其他过程的时间复杂度。

    例如:

    public static int getMax(int[] arr)
    {
       return process(arr,0,arr.length-1);
    }

    public static int process(int[] arr,int L,int R)
    {
       if(L==R)
           return arr[L];
       int mid = L+((R-L)>>1);//mid = L+((R-L)/2),/2可以表示为右移一位。
       int leftMax = process(arr,L,mid);
       int rightMax = process(arr,mid,R);
       return Math.max(leftMax,rightMax);
    }
  • 其中,T(N) = 2 * T(N/2) + O(1);a = 2,b = 2,d = 0;

(2)求时间复杂度:
  • log以b为底a的对数 < d , 时间复杂度为O(N^d);

  • log以b为底a的对数 > d , 时间复杂度为O(N^log以b为底a的对数);

  • log以b为底a的对数 = d , 时间复杂度为O((N^d) * logN);

2 O(NLogN)的排序:

(1) 归并排序:

public static void main(String[] args)
{
int[] arr = {2,4,6,4,6,7,1,8,3,9,8};
process(arr,0,arr.length-1);
for(int cur:arr)
{
System.out.print(cur+" ");
}
}

public static void process(int[] arr,int L,int R)
{
if(L==R)
return;
int mid = L+((R-L)>>1);
process(arr,L,mid);
process(arr,mid+1,R);
mergeSoft(arr,L,mid,R);
}

public static void mergeSoft(int[] arr,int L,int M,int R)
{
int[] help = new int[R-L+1];
int i=0;
int p1 = L;
int p2 = M+1;
while(p1<=M && p2<=R)
{
help[i++] = arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];
}
while(p1<=M)
help[i++] = arr[p1++];
while(p2<=R)
help[i++] = arr[p2++];
for(i=0;i<help.length;i++)
arr[L+i] = help[i];
}

example:小和问题,求逆序对

  • 小和问题描述:对于一个数组例如,2,1,5,8,9,6,3,4。其中2和5,8,9,6,3,4都会产生小和2,同理1与5,8,9,6,3,4也都会产生小和1,依次累加所有的小和然后返回。

//小和问题
public static void main(String[] args)
{
int[] arr = { 2,1,5,8,9,6,3,4};
int res = smallSum(arr);
System.out.println(res+" ");
}

public static int smallSum(int[] arr)
{
if(arr == null || arr.length<2)
return  -1;
return process(arr,0,arr.length-1);
}

public static int process(int[] arr,int L,int R)
{
if(L==R)
return 0;
int mid = L+((R-L)>>1);
return process(arr,L,mid)+process(arr,mid+1,R)+mergeSoft(arr,L,mid,R);
}

public static int mergeSoft(int[] arr,int L,int M,int R)
{
int[] help = new int[R-L+1];
int i=0;
int p1 = L;
int p2 = M+1;
int res = 0;
while(p1<=M && p2<=R)
{
res +=arr[p1]<arr[p2]?((R-p2+1)*arr[p1]):0;
help[i++] = arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];
}
while(p1<=M)
help[i++] = arr[p1++];
while(p2<=R)
help[i++] = arr[p2++];
for(i=0;i<help.length;i++)
arr[L+i] = help[i];
return res;
}

(2) 快速排序

public static void main(String[] args)
{
int[] arr = { 2,1,5,8,9,6,3,4};
quickSort(arr,0,(arr.length-1));
}

public static void swap(int[] arr ,int l,int r)
{
int temp = arr[r];
arr[r] = arr[l];
arr[l] = temp;
}

public static void quickSort(int[] arr,int l,int r)
{
if(l<r)
{
swap(arr,l+(int)(Math.random()*(r-l+1)),r);
int[] p =partition(arr,l,r);
quickSort(arr,l,p[0]-1);
quickSort(arr,p[1]+1,r);
}
}

public static int[]  partition(int[] arr,int l,int r)
{
int less = l-1;
int more = r;
while(l<more)
{
if(arr[l]<arr[r])
{
swap(arr,++less,l++);
}
else if(arr[l]>arr[r])
{
swap(arr,--more,l);
}
else
l++;
}
    swap(arr,more,r);
    return new int[]{less+1,more};
}

22.1.7 master公式及O(NLogN)的排序的更多相关文章

  1. Master公式计算递归时间复杂度

    我们在算递归算法的时间复杂度时,Master定理为我们提供了很强大的便利! Master公式在我们的面试编程算法中除了BFPRT算法的复杂度计算不了之外,其他都可以准确计算! 这里用求数组最大值的递归 ...

  2. 算法初级面试题01——认识时间复杂度、对数器、 master公式计算时间复杂度、小和问题和逆序对问题

    虽然以前学过,再次回顾还是有别样的收获~ 认识时间复杂度 常数时间的操作:一个操作如果和数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作. 时间复杂度为一个算法流程中,常数操作数量的指标.常 ...

  3. 数据结构与算法学习(二)——Master公式及其应用

    本篇文章涉及公式,由于博客园没有很好的支持,建议移步我的CSDN博客和简书进行阅读. 1. Master公式是什么? 我们在解决算法问题时,经常会用到递归.递归在较难理解的同时,其算法的复杂度也不是很 ...

  4. 左神算法第一节课:复杂度、排序(冒泡、选择、插入、归并)、小和问题和逆序对问题、对数器和递归(Master公式)

    第一节课 复杂度 排序(冒泡.选择.插入.归并) 小和问题和逆序对问题 对数器 递归 1.  复杂度 认识时间复杂度常数时间的操作:一个操作如果和数据量没有关系,每次都是固定时间内完成的操作,叫做常数 ...

  5. 转:master公式(主方法)

    master公式(也称主方法)是利用分治策略来解决问题经常使用的时间复杂度的分析方法,(补充:分治策略的递归解法还有两个常用的方法叫做代入法和递归树法),众所众知,分治策略中使用递归来求解问题分为三步 ...

  6. 备战秋招之十大排序——O(nlogn)级排序算法

    时间复杂度O(nlogn)级排序算法 五.希尔排序 首批将时间复杂度降到 O(n^2) 以下的算法之一.虽然原始的希尔排序最坏时间复杂度仍然是O(n^2),但经过优化的希尔排序可以达到 O(n^{1. ...

  7. 数据结构与算法——认识O(NlogN)的排序(1)

    归并排序 1) 整体就是一个简单递归,左边排好序.右边排好序.让其整体有序 2) 让其整体有序的过程里用了外排序方法 3) 利用master公式来求解时间复杂度 4) 归并排序的实质 时间复杂度0(N ...

  8. 时间复杂度为O(nlogn)的排序算法

    时间复杂度为O(nlogn)的排序算法(归并排序.快速排序),比时间复杂度O(n²)的排序算法更适合大规模数据排序. 归并排序 归并排序的核心思想 采用"分治思想",将要排序的数组 ...

  9. master公式 ------ 求递归情况下的时间复杂度

    剖析递归行为和递归行为时间复杂度的估算一个递归行为的例子T(N) = a*T(N/b) + O(N^d)1) log(b,a) > d -> 复杂度为O(N^log(b,a))2) log ...

随机推荐

  1. suse 12 二进制部署 Kubernetets 1.19.7 - 第03章 - 部署flannel插件

    文章目录 1.3.部署flannel网络 1.3.0.下载flannel二进制文件 1.3.1.创建flannel证书和私钥 1.3.2.生成flannel证书和私钥 1.3.3.将pod网段写入et ...

  2. 《从零开始, 开发一个 Web Office 套件》系列博客目录

    这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office 套件, 包括: 文档, 表格, 幻灯片... 等等. 对应的Github r ...

  3. BigDecimalAvoidDoubleConstructorRule:不要直接用double变量作为构造BigDecimal的参数

    先上结论: 不要直接用double变量作为构造BigDecimal的参数. 线上有这么一段Java代码逻辑: 1,接口传来一个JSON串,里面有个数字:57.3. 2,解析JSON并把这个数字保存在一 ...

  4. k8s核心资源:精简版yaml示例

    yaml语法及格式校验 详见:https://www.cnblogs.com/uncleyong/p/15437385.html 创建资源的三种方式 参考:https://www.cnblogs.co ...

  5. 网络主动测评系统,IT网络运维管理的法宝!

    随着计算机网络的普及和快速发展,互联网已经融入到人们的衣食住行等方方面面,如工作.购物.音视频聊天.视频会议.朋友圈.抖音.在线网游.网络电影电视等.毫不夸张地说,现如今大部分人的绝大多数时间都已经离 ...

  6. sql server 数据字符串替换函数

    sql server 替换函数 replace 函数参数 REPLACE(string_expression, string_pattern, string_replacement) 1.string ...

  7. 【C# 基础概念】抽象类、密封类及类成员

    使用 abstract 关键字可以创建不完整且必须在派生类中实现的类和 class 成员. 使用 sealed 关键字可以防止继承以前标记为 virtual 的类或某些类成员. abstract修饰符 ...

  8. Oracle之集合运算

    交集 INTERSECT :取两个查询结果集的共有部分 SELECT DEPTNO FROM EMP INTERSECT SELECT DEPTNO FROM DEPT;   补集 MINUS :用第 ...

  9. c语言怎么避免打印空数据?

    目录 前景提要 解决方案 实战演练 1.数组搭建 2.在循环处,处理这个问题 3.在循环中,添加过滤条件. 4.扩展了其他类型的数组,都是可以通过这种方式进行过滤,最后,得到打印的时候,没有空值. 总 ...

  10. PIL-ImageFont:OSError: cannot open resource

    使用PIL时,创建某个字体Font对象时出错: font=ImageFont.truetype('Arial.ttf',36) 可能原因有两个: 1.PIL无法定位到字体文件的位置. 可以通过提供绝对 ...