你好!今天的讲座与其他讲座略有不同。它的不同之处在于它仅与 Java 间接相关。 然而,这个话题对于每个程序员来说都非常重要。我们将讨论算法。什么是算法?简单来说,这是为了达到预期结果而必须执行的一系列操作。我们在日常生活中经常使用算法。例如,每天早上您都会面临一项任务:去学校或上班,同时:
- 着装
- 干净的
- 喂养得很好
- 被闹钟叫醒。
- 洗澡,洗脸。
- 准备早餐,煮咖啡/茶。
- 吃。
- 如果您从晚上开始就没有熨烫衣服,请熨烫它们。
- 穿上衣服。
- 离开这房子。
- 在互联网上购买或下载《俄罗斯人名词典》1966 年版。
- 在这本词典中查找我们列表中的每个名字。
- 在一张纸上写下这个名字位于字典的哪一页。
- 使用一张纸上的笔记将姓名按顺序排列。
for
您编写一个执行此任务的 常规循环
int[] numbers = new int[100];
// ..заполняем массив числами
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) - 恒定的复杂度。为什么?请注意:每次我们在列表的开头插入一个数字。此外,正如您所记得的,当将数字插入到LinkedList
元素中时,它们不会移动到任何地方 - 链接被重新定义(如果您突然忘记了 LinkedList 是如何工作的,请看一下我们的旧讲座之一)。如果现在列表中的第一个数字是 number х
,并且我们在列表的开头插入数字 y ,则所需要做的就是:
x.previous = y;
y.previous = null;
y.next = x;
对于这个参考的重新定义,现在有多少个数字对我们来说并不重要LinkedList
——至少一个,至少十亿。算法的复杂度是恒定的 - O(1)。
GO TO FULL VERSION