算法:NonextremeElement(S[], n)
输入:由n个整数构成的集合S
输出:其中的任一非极端元素
{
任取的三个元素x, y, z ∈ S; //既然S是集合,这三个元素必互异
通过比较,找出其中的最小者min{x, y, z}和最大者max{x, y, z};
输出最小、最大者之外的那个元素;
}
思路:
S 是有限集,故其中的最大、最小元素各有且仅有一个。
因此,无论 S 的规 模有多大,在前三个元素 S[0]、S[1]和 S[2]中,必包含至少一个非极端元素。
我们可以取 x = S[0]、y = S[1]和 z = S[ 2],这只需执行三次基本操作,耗费 O(3)时间。
为了确定这三个元 素的大小次序,我们最多需要做三次比较(请读者自己给出证明),也是 O(3)时间。
最后,输出居中 的那个元素只需 O(1)时间。
运行时间为: T(n) = O(3) + O(3) + O(1) = O(7) = O(1)
O(logn)⎯⎯进制转换
问题:给定任一十进制整数,将其转换为三进制表示。比如
23(10) = 212(3)
101(10) = 10202(3)
算法:BaseConversion(n)
输入:十进制整数n
输出:n的三进制表示
{
不断循环,直到n = 0 {
输出 n % 3; //取模
令 n = n/3; //整除
}
}
以 101(10)为例思路:
第一轮循环,输出 101 mod 3 = 2,n = 100/3 = 33; 2
第二轮循环,输出 33 mod 3 = 0,n = 33/3 = 11; 0
第三轮循环,输出 11 mod 3 = 2,n = 11/3 = 3; 2
第四轮循环,输出 3 mod 3 = 0,n = 3/3 = 1; 0
第五轮循环,输出 1 mod 3 = 1,n = 1/3 = 0。 1
result=10202(3)
该算法由若干次循环构成, 每一轮循环内部,都只需进行两次基本操作(取模、整除)。
每经过一轮循环,n都至少减少至 1/3。于是,至多经过
1+[log3n]
次循环,即 可减小至 0。
因此,该算法需要运行 O(2×(1+[log3n])) = O(log3n)时间。
鉴于大 O 记号的性质,我们通常会忽略对数函数的常底数。比如这里的底数为常数 3,故通常 将上述复杂度记作 O(logn)。
O(n)⎯⎯数组求和
问题:给定n个整数,计算它们的总和。
算法:Sum(A[], n)
输入:由n个整数组成的数组A[]
输出:A[]中所有元素的总和
{
令s = 0;
对于每一个A[i],i = 0, 1, …, n-1
令s = s + A[i];
输出s;
}
思路
对s的初始化需要O(1)时间。
每一轮循环中只需进行一次累 加运算,这属于基本操作,可以在O(1)时间内完成。
O(1) + O(1)×n = O(n+1) = O(n)
O(n2 )⎯⎯起泡排序
**问题:**冒泡排序
算法:Bubblesort(S[], n)
输入:n个元素组成的一个序列S[],每个元素由[0…n-1]之间的下标确定,元素之间可以比较大小
输出:重新调整S[]中元素的次序,使得它们按照非降次序排列
{
从S[0]和S[1]开始,依次检查每一对相邻的元素;
只要它们位置颠倒,则交换其位置;
反复执行上述操作,直到每一对相邻元素的次序都符合要求;
}
思路:
为了对n个整数排序,该算法的外循环最多需要做n轮。
经过第i轮循环,元素 S[n-i-1]必然就位,i = 0, 1, …, n-1。r
在第i轮外循环中,内循环需要做n-i-1 轮。
在每一轮内循环中, 需要做一次比较操作,另外至多需要做三次赋值操作,这些都属于基本操作,可以在O(4)的时间内 完成。
T(n)=∑i=0n−1(n−i−1)×O(4)=O(2n(n−1))=O(2n2–2n)
鉴于大 O 记号的特性,低次项可以忽略,常系数可以简化为 1,故再次得到 T(n) = O(n^2 )
O(2r )⎯⎯幂函数
**问题:**虑幂函数的计算
算法:PowerBruteForce®
输入:非负整数r
输出:幂2^r
{
power = 1;
while (0 < r–)
power = power * 2;
return power;
}
共需要做r次迭代,每次迭代只涉及常数次基本操作,故总共需要运行O®时间。
问题的输入规模为n,故有O® = O(2n )。
===================================================================
- 可解性
现代意义上的电子计算机所对应的计算模型,就是所谓的图灵机
- 有效可解
具体来说就是指存在某一算法,能够在多项式时间以内解决这一问题。反之,若某问题的任一 算法都具有不低于指数的复杂度,则不是有效可解的
- 下界
在任何一种特定计算模型下,对于任一可有效解决的问题,任何算法的时间复杂度都 不可能低于某一范围,我们称之为该问题在这一计算模型下的复杂度下界,或简称该问题的下界。
=================================================================
当某个方法调用自己时,我们就称之为递归调用(Recursive call )。
线性递归
类方法的每个实例只能递归地调用自己至多一次.
最后一次递归调用被称作递归的“基底”,简称“递归基”。
性质:经过有限的时间后,它必须能够终止。
线性递归式算法都具有如下形式:
- 检测递归基。首先要检测是否到达递归基,也就是最基本、最简单的情况,在这些平凡情 况下无需做进一步递归调用。
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
817218)]
[外链图片转存中…(img-jFgFMsS3-1715740817218)]
[外链图片转存中…(img-B7IDzy6W-1715740817218)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!