你好!今天的课程与其他课程略有不同。它的不同之处在于它仅与 Java 间接相关。 也就是说,这个主题对每个程序员都非常重要。我们将讨论算法。什么是算法?简而言之,它是为达到预期结果而必须完成的一些动作序列。我们在日常生活中经常使用算法。例如,每天早上您都有一项特定任务:去上学或上班,同时:
- 穿着衣服
- 干净的
- 美联储
- 使用闹钟叫醒。
- 冲个澡,把自己洗干净。
- 做早餐和一些咖啡或茶。
- 吃。
- 如果你前一天晚上没有熨衣服,那就熨吧。
- 穿上衣服。
- 离开这房子。
- 购买或下载 1961 年版的韦氏第三版新国际词典。
- 在这本词典中找到我们列表中的每个名字。
- 在一张纸上,写下名字所在的字典页码。
- 用纸片对名字进行排序。
for
您编写一个执行此任务的 普通循环
int[] numbers = new int[100];
// ...fill the array with numbers
for (int i: numbers) {
System.out.println(i);
}
这个算法的复杂度是多少?线性的,即O(n)。 程序必须执行的操作数量取决于传递给它的数字数量。如果数组中有 100 个数字,就会有 100 个动作(在屏幕上显示字符串的语句)。如果数组中有 10,000 个数字,则必须执行 10,000 个操作。我们的算法可以以任何方式改进吗?不行,无论如何,我们都得让N遍遍历数组,执行N条语句,才能在控制台上显示字符串。考虑另一个例子。
public static void main(String[] args) {
LinkedList<Integer> numbers = new LinkedList<>();
numbers.add(0, 20202);
numbers.add(0, 123);
numbers.add(0, 8283);
}
我们有一个空的LinkedList
,我们在其中插入几个数字。在我们的示例中,我们需要评估将单个数字插入到的算法复杂性LinkedList
,以及它如何取决于列表中元素的数量。答案是O(1),即复杂度不变。为什么?请注意,我们在列表的开头插入了每个数字。此外,您会记得,当您向 a 中插入一个数字时LinkedList
,元素不会移动到任何地方。链接(或引用)已更新(如果您忘记了 LinkedList 的工作原理,请查看我们的旧课程之一)。如果我们列表中的第一个数字是x
,并且我们在列表的前面插入数字 y ,那么我们需要做的就是:
x.previous = y;
y.previous = null;
y.next = x;
当我们更新链接时,我们不关心 中已经有多少数字LinkedList
,无论是一还是十亿。算法的复杂度是常数,即O(1)。
GO TO FULL VERSION