当前位置: 首页 > news >正文

算法学习3

学习目录

  • 1.递归行为时间复杂度
  • 2.归并排序

1.递归行为时间复杂度

需要使用master公式:
T(N) = a * T(N / b) + O(N d)
a:表示在递归函数中递归函数被使用的次数
b:表示每个递归函数计算个数占整体多少份的倒数
O(N d):表示在整个递归函数中除去调用函数的其他代码的时间复杂度

如:
递归函数的代码

int process(int[] arr,int L,int R){if(L == R)return arr[L];int mid = L + ((R - L) >> 1);int leftMax = process(arr,L,mid);int rightMax = process(arr,mid + 1,R);return Math.max(leftMax,rightMax);
}

其master公式为:
T(N) = 2 * T (N / 2) + O(1)

时间的复杂度:

  1. 当logba < d 时,其时间复杂度为O(Nd)
  2. logba = d 时,其时间复杂度为O(Nlog(b,a))
  3. logba > d 时,其时间复杂度为O(Nd * logN)

2.归并排序

原理:
将数组分为左右两部分,分别对左右两部分进行排序;
从左右部分的第一个数进行比较大小,将大(或者小)的数拷贝到一个辅助数组的第一个位置;
取左右部分中已经拷贝的元素的下一位数,与另外部分未拷贝的元素接着比较,并拷贝到辅助数组中,直到左右部分中的其中一部分全部拷贝过一遍;
接着将左右部分中未完全拷贝的部分,按照其当前顺序全部拷贝到辅助数组中;

其代码如下:

//分别将左右部分进行排序
public void process(int[] arr,int L,int R){if(L == R)return arr[L];int mid = L + ((R - L) >> 1);int leftMax = process(arr,L,mid);int rightMax = process(arr,mid + 1,R);merge(arr,L,mid,R);
}//将整体进行排序
public void merge(int[] arr,int L,int M,int R){int[] help = new int[R - L + 1];int i = 0;//p1为左边部分的下标,p2为右边部分的下标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 + 1] = help[i];}
}

http://www.mrgr.cn/news/37860.html

相关文章:

  • 2024最新Linux Socket编程
  • 串匹配问题的三种算法
  • 大豆重测序-文献精读53
  • 树上差分详解
  • Java网络通信—UDP
  • 盘点2024年4款高效率的语音转文字工具。
  • 算法刷题笔记 约数个数(详细注释的C++实现)
  • MySQL 之索引详解
  • Python使用最广泛的数据验证库Pydantic
  • 【中级通信工程师】终端与业务(九):市场细分与选择
  • 【洛谷】P4819 [中山市选] 杀人游戏 的题解
  • AT89C51 利用SBIT寻址,并且在内存中实现伪动态密码的混淆
  • 设计模式之迭代器模式
  • 前端练习总结(1)
  • 解决方案:如何将字段名转成列,并将对应权重数值做好拼接
  • SQLite百万级数据量高性能读写
  • 基于springboot的书店图书销售管理系统的设计与实现 (含源码+sql+视频导入教程)
  • 技术速递|适用于 .NET 和 .NET MAUI Android 应用程序的 Android 资产包
  • ROS理论与实践学习笔记——2 ROS通信机制之通信机制实践
  • Redis篇(Java操作Redis)