话本小说网 > 校园小说 > 学霸之路
本书标签: 校园  励志小说  学习   

第一章 计算机类(1 离散数学……)

学霸之路

大学计算机专业课程:

电子技术、离散数学、程序设计、数据结构、操作系统、计算机组成原理、微机系统、计算机系统结构、编译原理、计算机网络、数据库系统、软件工程、人工智能、计算机图形学、数字图像处理、计算机通讯原理、多媒体信息处理技术、数字信号处理、计算机控制、网络计算、算法设计与分析、信息安全、应用密码学基础、信息对抗、移动计算、数论与有限域基础、人机界面设计、面向对象程序设计等。

大学计算机专业是计算机硬件与软件相结合、面向系统、侧重应用的宽口径专业。计算机学科的特色主要体现在:理论性强,实践性强,发展迅速。

离散数学(Discrete mathematics)是研究离散量的结构及其相互关系的数学学科,是现代数学的一个重要分支。离散的含义是指不同的连接在一起的元素,主要是研究基于离散量的结构和相互间的关系,其对象一般是有限个或可数个元素。离散数学在各学科领域,特别在计算机科学与技术领域有着广泛的应用,同时离散数学也是计算机专业的许多专业课程,如程序设计语言、数据结构、操作系统、编译技术、人工智能、数据库、算法设计与分析、理论计算机科学基础等必不可少的先行课程。通过离散数学的学习,不但可以掌握处理离散结构的描述工具和方法,为后续课程的学习创造条件,而且可以提高抽象思维和严格的逻辑推理能力,为将来参与创新性的研究和开发工作打下坚实的基础。

随着信息时代的到来,工业革命时代以微积分为代表的连续数学占主流的地位已经发生了变化,离散数学的重要性逐渐被人们认识。离散数学课程所传授的思想和方法,广泛地体现在计算机科学技术及相关专业的诸领域,从科学计算到信息处理,从理论计算机科学到计算机应用技术,从计算机软件到计算机硬件,从人工智能到认知系统,无不与离散数学密切相关。由于数字电子计算机是一个离散结构,它只能处理离散的或离散化了的数量关系, 因此,无论计算机科学本身,还是与计算机科学及其应用密切相关的现代科学研究领域,都面临着如何对离散结构建立相应的数学模型;又如何将已用连续数量关系建立起来的数学模型离散化,从而可由计算机加以处理。

离散数学是传统的逻辑学,集合论(包括函数),数论基础,算法设计,组合分析,离散概率,关系理论,图论与树,抽象代数(包括代数系统,群、环、域等),布尔代数,计算模型(语言与自动机)等汇集起来的一门综合学科。离散数学的应用遍及现代科学技术的诸多领域。

离散数学也可以说是计算机科学的基础核心学科,在离散数学中的有一个著名的典型例子-四色定理又称四色猜想,这是世界近代三大数学难题之一,它是在1852年,由英国的一名绘图员弗南西斯·格思里提出的,他在进行地图着色时,发现了一个现象,"每幅地图都可以仅用四种颜色着色,并且共同边界的国家都可以被着上不同的颜色"。那么这能否从数学上进行证明呢?100多年后的1976年,肯尼斯·阿佩尔(Kenneth Appel)和沃尔夫冈·哈肯(Wolfgang Haken)使用计算机辅助计算,用了1200个小时和100亿次的判断,终于证明了四色定理,轰动世界,这就是离散数学与计算机科学相互协作的结果。

离散数学可以看成是构筑在数学和计算机科学之间的桥梁,因为离散数学既离不开集合论、图论等数学知识,又和计算机科学中的数据库理论、数据结构等相关,它可以引导人们进入计算机科学的思维领域,促进了计算机科学的发展。

学科内容

1.集合论部分:集合及其运算、二元关系与函数、自然数及自然数集、集合的基数

2.图论部分:图的基本概念、欧拉图与哈密顿图、树、图的矩阵表示、平面图、图着色、支配集、覆盖集、独立集与匹配、带权图及其应用

3.代数结构部分:代数系统的基本概念、半群与独异点、群、环与域、格与布尔代数

4.组合数学部分:组合存在性定理、基本的计数公式、组合计数方法、组合计数定理

5.数理逻辑部分:命题逻辑、一阶谓词演算、消解原理

离散数学被分成三门课程进行教学,即集合论与图论、代数结构与组合数学、数理逻辑。教学方式以课堂讲授为主, 课后有书面作业、通过学校网络教学平台发布课件并进行师生交流。

一、线性表

线性表是最常用且最简单的一种数据结构,它是n个数据元素的有限序列。

实现线性表的方式一般有两种,一种是使用数组存储线性表的元素,即用一组连续的存储单元依次存储线性表的数据元素。另一种是使用链表存储线性表的元素,即用一组任意的存储单元存储线性表的数据元素(存储单元可以是连续的,也可以是不连续的)。

数组实现

数组是一种大小固定的数据结构,对线性表的所有操作都可以通过数组来实现。虽然数组一旦创建之后,它的大小就无法改变了,但是当数组不能再存储线性表中的新元素时,我们可以创建一个新的大的数组来替换当前数组。这样就可以使用数组实现动态的数据结构。

代码1 创建一个更大的数组来替换当前数组

int[] oldArray = new int[10];

int[] newArray = new int[20];

for (int i = 0; i < oldArray.length; i++) {

newArray[i] = oldArray[i];

}

// 也可以使用System.arraycopy方法来实现数组间的复制

// System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);

oldArray = newArray;

代码2 在数组位置index上添加元素e

//oldArray 表示当前存储元素的数组

//size 表示当前元素个数

public void add(int index, int e) {

if (index > size || index < 0) {

System.out.println("位置不合法...");

}

//如果数组已经满了 就扩容

if (size >= oldArray.length) {

// 扩容函数可参考代码1

}

for (int i = size - 1; i >= index; i--) {

oldArray[i + 1] = oldArray[i];

}

//将数组elementData从位置index的所有元素往后移一位

// System.arraycopy(oldArray, index, oldArray, index + 1,size - index);

oldArray[index] = e;

size++;

}

上面简单写出了数组实现线性表的两个典型函数,具体我们可以参考Java里面的ArrayList集合类的源码。数组实现的线性表优点在于可以通过下标来访问或者修改元素,比较高效,主要缺点在于插入和删除的花费开销较大,比如当在第一个位置前插入一个元素,那么首先要把所有的元素往后移动一个位置。为了提高在任意位置添加或者删除元素的效率,可以采用链式结构来实现线性表。

链表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点组成,这些节点不必在内存中相连。每个节点由数据部分Data和链部分Next,Next指向下一个节点,这样当添加或者删除时,只需要改变相关节点的Next的指向,效率很高。

[图片]

单链表的结构下面主要用代码来展示链表的一些基本操作,需要注意的是,这里主要是以单链表为例,暂时不考虑双链表和循环链表。

代码3 链表的节点

class Node<E> {

E item;

Node<E> next;

//构造函数

Node(E element) {

this.item = element;

this.next = null;

}

}

代码4 定义好节点后,使用前一般是对头节点和尾节点进行初始化

//头节点和尾节点都为空 链表为空

Node<E> head = null;

Node<E> tail = null;

代码5 空链表创建一个新节点

//创建一个新的节点 并让head指向此节点

head = new Node("nodedata1");

//让尾节点也指向此节点

tail = head;

代码6 链表追加一个节点

//创建新节点 同时和最后一个节点连接起来

tail.next = new Node("node1data2");

//尾节点指向新的节点

tail = tail.next;

代码7 顺序遍历链表

Node<String> current = head;

while (current != null) {

System.out.println(current.item);

current = current.next;

}

代码8 倒序遍历链表

static void printListRev(Node<String> head) {

//倒序遍历链表主要用了递归的思想

if (head != null) {

printListRev(head.next);

System.out.println(head.item);

}

}

代码 单链表反转

//单链表反转 主要是逐一改变两个节点间的链接关系来完成

static Node<String> revList(Node<String> head) {

if (head == null) {

return null;

}

Node<String> nodeResult = null;

Node<String> nodePre = null;

Node<String> current = head;

while (current != null) {

Node<String> nodeNext = current.next;

if (nodeNext == null) {

nodeResult = current;

}

current.next = nodePre;

nodePre = current;

current = nodeNext;

}

return nodeResult;

}

上面的几段代码主要展示了链表的几个基本操作,还有很多像获取指定元素,移除元素等操作大家可以自己完成,写这些代码的时候一定要理清节点之间关系,这样才不容易出错。

链表的实现还有其它的方式,常见的有循环单链表,双向链表,循环双向链表。 循环单链表 主要是链表的最后一个节点指向第一个节点,整体构成一个链环。 双向链表 主要是节点中包含两个指针部分,一个指向前驱元,一个指向后继元,JDK中LinkedList集合类的实现就是双向链表。** 循环双向链表** 是最后一个节点指向第一个节点。

作者看来我还是不会-_-||写文。

学霸之路最新章节 下一章 第二章 计算机类(2 栈与队列栈和队列……)