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

算法学习3

学习目录

  • 1.递归行为时间复杂度
  • 2.归并排序
    • 1.求小和问题

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];
	}
}

1.求小和问题

在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和;
举例:
数组[1,3,4,2,5],其中1左边比1小的数没有,3左边比3小的数为1,以此类推,者可以得到小和为:1+1+3+1+1+3+4+2=16;

解决这个问题可以使用归并排序进行快速的求出小和。


http://www.kler.cn/a/330750.html

相关文章:

  • 【设计模式】介绍常见的设计模式
  • 51单片机(一) keil4工程与小灯实验
  • 【Linux】模拟Shell命令行解释器
  • 欧拉公式和傅里叶变换
  • 2024年华为OD机试真题-判断一组不等式是否满足约束并输出最大差-Python-OD统一考试(E卷)
  • 测试覆盖率
  • 服务保护sentinel
  • ASP.NET MVC5使用依赖注入实现DI asp.net mvc5使用依赖注入
  • sql-labs:17~41(sql时间盲注和布尔盲注、sql注入爆数据思路、简单的sql注入绕过)
  • 探索高效免费的PDF转Word工具,开启便捷办公之旅
  • 小程序用户截屏事件
  • nodejs:实现大文件的分段上传
  • java落地AI模型案例分享:xgboost模型java落地
  • linux自用小手册
  • ZYNQ: GPIO 之 EMIO 按键控制 LED 实验
  • Elasticsearch使用Easy-Es + RestHighLevelClient实现深度分页跳页
  • 【热门主题】000002 案例 JavaScript网页设计案例
  • 如何在 Kubernetes 上部署和配置开源数据集成平台 Airbyte?
  • LampSecurityCTF7 靶机渗透 (sql 注入, 文件上传, 密码喷射)
  • vue单点登录异步执行请求https://xxx.com获取并处理数据
  • 博文汇总目录
  • C语言自定义类型结构体
  • 茴香豆 + Qwen-7B-Chat-Int8
  • 高级架构师面试题
  • 第24天sql注入(小迪安全学习)
  • GPT与大模型行业落地实践探索