计算机科学是一个拥有多个分支的广阔领域。但无论你是从事数据科学、计算机网络、密码学、网络开发,还是其他领域的工作,你都需要在计算机科学基础知识方面打下坚实的基础,以实现你的目标。
无论你在编程的道路上处于什么位置,了解基础知识将帮助你成为一个更明智和有效的开发者。例如,你可以学习如何利用你感兴趣的领域的专业知识来开发一种算法。但你仍然需要对计算思维和其他基础性话题感到满意,以便:
- 计算算法的时间和空间复杂性
- 最好地利用现有的数据结构
- 证明算法的正确性
你可能还需要决定哪种编程语言最适合你的任务。要做到这一点,你应该明白:
- 什么时候编程语言应该是高级的或低级的
- 什么时候应该选择带有编译器的编程语言与解释器的编程语言
我们将在本文后面解释这些概念,但只需说你不掌握计算机科学的基本原理,就根本无法解决这些问题。今天,我们将从高层次上向你介绍CS基础知识的三个领域,并建议在每个领域进一步阅读。从计算机科学的理论工作到软件工程或软件开发,无论你是否有CS学位,了解这些基础知识都是非常有价值的。 让我们开始吧!
1.硬件和软件基础知识
让我们从基础层面开始:你编程的机器,以及它们所运行的程序。计算机体系结构是指一门科学或一组规则,说明软件和硬件是如何结合并相互作用以使计算机发挥作用。这个定义引入了两个核心概念:硬件和软件。硬件是与计算机物理连接的任何东西。例如,你的显示器、打印机、鼠标和硬盘驱动器都是硬件组件。与之相比,软件是在计算机上执行任务的程序和程序的集合。软件是一个有序的指令序列,可以改变计算机硬件的状态。
首先要学习的硬件知识
在计算机硬件方面需要了解的一些主题包括。
硬件组件
-
中央处理单元(CPU):在计算机上处理信息。它是一个物理对象,从主存储器中获取数据,对其进行处理,并将更新的数据返回到主存储器中。
-
控制单元(CU):CPU的一个子单元,控制来自和进入主存储器的数据流。
-
算术和逻辑单元(ALU):CPU的另一个子单元,负责处理算术和逻辑运算。
-
输入单元:从世界或输入设备获取数据,并将其转换为字节流。例如:键盘、鼠标、麦克风、摄像头和USB。
-
输出单元:从CPU中获取经过处理的数据,并以人类可理解的方式呈现。例如:显示器屏幕、打印机和耳机。
-
存储单元:数据在被检索和处理后被存储的地方。存储单元,或称内存,是物理内存空间。
-
内存:包括主存储器或随机存取存储器(RAM),它们是计算机中的物理内存空间,以及二级存储,如硬盘、CD、USB闪存驱动器等。
硬件架构
- 冯-诺伊曼架构:约翰-冯-诺伊曼在1945年的设计,至今仍用于今天生产的大多数计算机中,其中程序指令和数据共享相同的内存和通路。
- 哈佛架构:一种计算机架构,其中数据和指令的存储和信号通道是分开的,与冯-诺依曼架构相反。
- 指令集架构(ISA):一个计算机的抽象模型。一个实施方案是一个执行ISA指定的指令的设备。一般来说,ISA为一个实施系列规定了以下内容:
- 指令
- 数据类型
- 寄存器
- 管理主存储器的硬件支持
- 基本特征
- 输入/输出模型
首先要学习的软件知识
软件中需要了解的一些主题包括
编程语言的类型
-
机器语言:计算机能够处理的唯一语言:称为二进制的1和0的流。机器语言被认为是一种低级别的编程语言。
-
汇编语言:一种人类可读的低级编程语言,将二进制翻译成汇编指令,汇编指令必须翻译成计算机的机器语言。汇编语言是机器语言和高级编程语言之间的桥梁。
-
高级语言:也被称为编程语言(如:Python、C++、Java)。这些语言允许在没有大量低级指令(即汇编语言指令)的情况下创建强大、复杂、人类可读的程序。
关键的软件类型
-
汇编器:一个将汇编语言程序翻译成机器语言的实用程序。
-
编译器:主要是将用高级编程语言编写的源代码翻译成机器可读的低级语言目标代码的程序,如机器语言或汇编语言。一旦翻译完成,目标代码被传递到目标机器上执行。
-
解释器:在执行源代码时,将用高级编程语言编写的源代码逐段翻译成机器可读的低级语言的目标代码的一种程序。
-
作业系统:支持计算机基本功能的软件,管理计算机硬件和软件资源,并为计算机程序提供公共服务。
-
用户应用程序:通常为终端用户编写的软件,旨在执行与计算机系统运行无关的特定任务。今天,这种应用程序可能采取独立的应用程序、基于网络的应用程序和移动应用程序的形式。
2.数据结构和它们的属性
我们的下一个领域是数据结构。数据结构是用于组织、管理和存储数据的格式,能够有效地访问和修改。正如我们将在第三部分讨论的那样,你将算法应用于数据结构来解决问题。
关于数据结构,首先要学习什么?
一些需要了解的数据结构主题包括。
-
数组:一个具有相同变量类型的项目集合,按顺序存储在内存中。数组中的每个项目都从0开始索引,每个项目被称为一个元素。数组最适合在恒定时间内检索数据(使用索引),但不提供快速插入或删除数据。阅读更多关于数组的信息。
-
链接列表:一个被链接在一起的节点的线性序列。在单链表中,每个节点包含一个值和一个指向列表中下一个节点的指针。与数组不同,单链表没有索引,所以你必须从第一个节点开始,遍历每个节点,直到你到达第n个节点。与数组相比,链接列表提供更快的删除和插入,但数据检索速度较慢。阅读更多关于链接列表的信息。
-
树:一种非线性的数据结构,通常用来表示分层数据。例如,一个分层的公司结构使用树来组织。阅读更多关于树的信息。
-
堆栈:一个线性结构后进先出(LIFO)的顺序。想象一下一叠盘子可能会有帮助。你放在栈顶的最后一个盘子就是你拿出的第一个。堆栈就是这样工作的。阅读更多关于堆栈的信息。
-
队列:与栈相似,它们都是具有动态大小的线性数据结构。然而,队列是先入先出(FIFO)的数据结构。想象一下,你在为过山车排队。第一个排队的人可以先离开队伍去坐车。阅读更多关于队列的信息。
-
图形:一种抽象的符号,表示所有对象对之间的联系。阅读更多关于图的信息。
-
哈希表:取决于散列的过程,或将一个对象分配到一个唯一的索引,称为键。每个对象都用键值对来识别,对象的集合被称为字典。散列表是通过将元素存储在一个数组中并通过一个键来识别它们来实现的。散列函数接收一个键并返回一个索引,该索引的值被存储。阅读更多关于哈希表的信息。
-
堆:一种基于树的高级数据结构,主要用于排序和实现优先级队列。阅读更多关于堆的信息。
3.算法:复杂度和设计
对计算机科学家来说,算法是一系列定义明确的指令,告诉计算机如何解决一个问题。如上所述,算法被应用于各种数据结构,而且它们是编码面试中最受欢迎的话题。
关于算法,首先要学习什么
一些需要了解的算法主题包括。
时间复杂度和正确性
-
渐进式时间复杂度:一种计算算法的精确运行时间的分析,并且与平台和输入无关。这样的时间复杂度分析告诉我们,当输入的大小增长时,程序的表现如何,与底层机器无关。我们用Big O代表上界,Big Omega(Ω\Omega)代表下界,Big Theta(Θ\Theta)代表运行时间的紧界。渐进式时间复杂度通常比基于特定输入和特定平台的分析更受欢迎。
-
递归算法的时间复杂度:计算迭代算法的渐进时间复杂度是很简单的。为了计算递归算法的时间复杂度,我们可以使用替换法、Master定理或递归树。其中,替换法被认为是最严格的,因为它是基于数学归纳法的。
-
渐进式空间复杂度:对一个算法需要多少内存的分析。同样的渐进式符号(Big O, Big Omega, and Big Theta)也被用来表示一个算法的空间复杂度。
-
正确性证明技术:用来证明一个给定的算法是正确的,并将总是产生预期的输出的方法。一个例子是证明一个排序算法总是会对一个列表进行排序,而不管列表中的数据是什么。最常见和最广泛使用的正确性技术被称为 "循环不变性",它是基于数学归纳法的。
算法设计技术
-
蛮力:一种需要通过所有的可能性来寻找正在尝试的问题的解决方案的方法。通常情况下,人们首先想到的是这种算法。它也是效率最低的,因此大多不能在可行的时间内给出我们想要的解决方案。例如,使用蛮力破解一个合理的密码可能需要几百年的时间。
-
分割与征服:一种将问题分解成更小的子任务的模式,然后用递归的方式解决这些子任务,并最终重新组合起来。递归是指一个函数直接或间接地调用自己的做法。分割和征服算法的例子包括合并排序和quicksort。
-
动态编程:一种类似于划分和征服的模式。我们把一个大问题分成小的子任务,并把它们的解决方案结合起来。然而,一个关键的区别是,一个子任务可能与其他子任务重叠。因此,为了减少运行时间,我们将每个子任务的结果保存在内存中,称为记忆化。记忆化确保每个子任务只被执行一次。每当再次需要一个子任务时,其结果就会立即从内存中检索出来。
-
贪婪:一种方法,在这种方法中,我们试图使用现有的最佳局部解决方案来解决每个子任务,称为局部优化。贪婪算法只有在局部最优方案将我们引向全局最优方案,即可能的最佳全局方案时才会产生最佳结果。贪婪算法的例子有Prim算法和Dijkstra算法,前者寻找最小生成树,后者寻找图形中的最短路径。
-
其他设计技术:当寻找最优解耗费时间或不可行时,近似算法会找到一个接近最优的解决方案。随机化算法和线性编程是其他经常使用的算法设计技术。
关键算法类别
- 排序和搜索:将列表中的元素按顺序排列的算法,或从存储元素的任何数据结构中检查或检索该元素的算法。排序的例子包括mergesort, quicksort, bubble sort, selection sort, and insertion sort.搜索的例子包括线性搜索和二进制搜索。
- 图形:用于解决表示图为网络的问题的算法(例如,航空公司的航班,互联网如何连接,社会网络连接)。正如前面所定义的,图是一种抽象的符号,表示所有对象对之间的联系。
- 最短路径:用于寻找图中最短路径的算法,这是一个用于计算机科学不同领域的基本问题。存在许多排序算法,每种算法都有自己的优势和劣势。根据数据的类型、数据的大小和用户的应用来选择一种算法。