java数据结构

@TOC数据结构(java)

总得说点什么

迷迷糊糊混了几十年,终于想要做点对得起自己的事情,从这篇博客开始,也许我的生活会开始改变,你也是。就自己而言,我觉得学习没必要在意形式,知识还是要进脑子。但是越来越多的零碎信息的充斥下,我意识到光靠我过去自己的那套学习方式已经行不通了,学习就我而言,需要钻进去,了解细节,再跳出来,调整方向。既要考究知识点,也要善于做总结。最重要的是,我这脑子是真的记不住啊。客观而言,我的基础应该比读到这篇文章的各位都差,不过既然是学习嘛,就得先承认自己的不足,才有改进的机会。博客中有哪里不对或者不全的,还希望各位不吝赐教。学习要重实际,也要重章法,我仍在摸索如何学习,希望从今天开始的十年,我能做出些改变。

数据结构(聊点感兴趣的知识)

时间复杂度

讲数据结构开始当然不会讲时间复杂度,不过我这个地方总是不懂,就先写写。

推倒大O阶方法

  • 1.用常数1取代运行时间中的所有加法常数。
  • 2.在修改后的运行次数函数,只保留最高阶项
  • 3.如果最高阶项存在且不是1,则除去与这个项相乘的常数
    得到的结果就是O阶

常数阶

int sum = 0,n = 100;	/*执行一次*/
sum = (1+n)*n/2;	/*执行一次*/
System.out.println(sum);	/*执行一次*/

这虽然是三次,但时间复杂度仍会被记作O(1)
对于分支结构而言,无论是真是假,执行的次数都是恒定的,不会随着n的变大而发生变化,所以单纯的分支结构(不包含在循环结构中),其时间复杂度也是O(1)。

线性阶

线性阶的循环结构会复杂很多,要确定某个算法的阶次,我们常常需要确定某个特定语句或某个语句集运行的次数。我们要分析算法的复杂度,关键就是要分析循环结构的运行情况。

for(int i=0;i<n;i++){
/*时间复杂度为1的程序步骤序列*/
}

循环的时间复杂度为O(n),因为循环体中的代码必须要执行n次。因为循环体中的代码要执行n次。

对数阶

int count = 1;
while(count < n){
	count = count * 2;
	/*时间复杂度为O(1)的程序步骤序列*/
}

有多少个2相乘后大于n,会退出循环,2x= n得到x = log2n,所以循环的时间复杂度为O(logn)

平方阶

for(int i=0;i<n;i++){
	for(int j=0;j<n;j++){
	/*时间复杂度为O(1)的程序步骤序列*/
	}
}

两个for循环,时间复杂度为O(n2)

for(int i=0;i<m;i++){
	for(int j=0;j<n;j++){
	/*时间复杂度为O(1)的程序步骤序列*/
	}
}

外循环的循环次数改为了m,时间复杂度变为O(m*n)
循环的时间复杂度等于循环体的复杂度乘以该循环运行的次数

for(int i=0;i<m;i++){
	for(int j=i;j<n;j++){
	/*时间复杂度为O(1)的程序步骤序列*/
	}
}

当i=0时,内循环执行了n次,当i=1时,执行了n-1次,。。。当i=n-1时执行了1次
总的执行次数为:
n+(n-1)+(n-2)+…+1 = (1+n)*n/2=n2/2+n/2
时间复杂度是O(n2)

参考书籍:《大话数据结构》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值