邓俊辉数据结构第一章:绪论笔记(未完待续)

2024-02-24 10:36

本文主要是介绍邓俊辉数据结构第一章:绪论笔记(未完待续),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                                              第一章:绪论

         计算机科学的学习重心是:具体地深入思考与分析获得对问题本质的透彻理解,按照长期积淀的框架与模式设计出符合问题内在规律的算法。选用、定制、改进足以支撑算法高效实现的数据结构,并在真实的应用环境中充分测试、调校和改进,构成了计算机高效求解实际问题的典型流程和不二法门。每一位有志于驾驭计算机的学生都应该从这些问题入手,不断学习、反复练习和勤于总结。

1.1 计算机与算法

        计算机科学的核心在于研究计算方法的过程与规律,而不仅仅是计算机工具本身。因此,E.Dijkstra以及追随者们更倾斜于这样称呼:计算科学。

1.1.1 埃及人的绳索

       问题1: 过直线上一点作直线的垂线。方法如下:最后竖线和横线垂直。

                       

        问题2:三等分一条线段。如下:水平线段是要被等分的线段。

        

1.1.3起泡排序

        待解决的问题:对n个元素进行升序排序。

        算法基本思路:假设对arr[n]进行升序排序。

第一趟:对arr[i]与arr[i+1], 其中0 <= i <= n-2.如果arr[i] > arr[i+1],那么交换arr[i]和arr[i+1]的值。第一趟结束后,数组的最后一个元素已经是最大的了。

第二趟:对arr[i]与arr[i+1],其中 0 <= i <= n-3。如果arr[i] > arr[i+1],那么交换arr[i]和arr[i+1]的值。第二趟结束后,数组的倒数第二个元素已经就位了。

以此类推....

        共需要比较n-1趟,那么后n-1个元素都就位,整体也就排好序了。

void bubbleSort(int *arr,int n)
{int compareNum = n - 1;         int i,j;for(j = 1;j < n;j ++)             //共比较 n-1 趟{for(i = 0;i < compareNum; i ++)    //每趟比较compareNum个元素{if(arr[i] > arr[i + 1])swap(arr[i],arr[i+1]);      //c++ 标准库函数swap,作用是交换两个实参}	compareNum --;       //每趟比较的最后compareNum减一,因为下一趟比上一趟少比较一个元素}
}

1.1.4 算法

1.算法

         算法:是指基于特定的计算模型,旨在解决某一信息处理问题而设计的一个指令序列。

算法必须具备的3个要素:
(1)输入输出:

        输入:对待求解问题的特定实例的某种描述,统称为输入。

        输出:经过计算和处理之后的信息即针对输入问题实例的答案。

(2)基本操作、确定性与可行性:

        算法应该描述为由若干语义明确的基本操作组成的指令序列,且每个基本操作在对应的计算模型中均可兑现。

        子算法:借助基本操作组合解决子问题的算法,即解决子问题的算法。

        对现代计算机而言,一个算法满足确定性与可行性仅当可以通过程序设计语言精确地描述。

(3)有穷性与正确性
        任意算法都应该在执行有限次基本操作之后终止并给出输出。此即算法的有穷性(finiteness)。

        输出就应该符合问题本身实现确定的条件——正确性。

        证明算法的有穷性和正确性的一个重要技巧,就是从适当的角度审视整个计算过程,并找出其所具有的某种不变性和单调性。其中的单调性是指:问题的有小规模会随着算法的推进不断递减。

        bubbleSort的不变性和单调性应该如何体现呢?

        经过k趟的扫描交换之后,最大的前k个元素必然就位;经过k趟扫描交换之后,待求解问题的有小规模将缩减至n-k。

(4)退化与鲁棒性

       算法的鲁棒性:对于退化情况,算法依然可以正确返回不至于出现异常。

(5)重用性

        重用性:算法模式可推广并适用不同类型基本元素的这种特性。

1.1.5 算法效率

(1)可计算性:指的是一个实际问题是否能够通过算法在有限时间内被计算机解决

(2)难解性:问题的最低求解时间成本的高低。

(3)计算效率:算法效率是指算法执行的时间。
(4)数据结构:数据的表现形式。算法的输入和输出,都是以数据结构表示。

1.2 复杂度度量

 1.2.1 时间复杂度

1.时间复杂度:随着输入规模的扩大,算法的执行时间的变化趋势可表示为输入规模的一个函数,称为该算法的时间复杂度(time complexity)。算法处理规模为n的的问题所需的时间可记作T(n)。注:在规模是n的所有输入中选择执行时间最长者作为T(n),并以T(n)度量该算法的时间复杂度。

1.2.2 渐进复杂度

       着眼长远,更为注重时间复杂度的总体变化趋势和增长速度的策略与方法,即所谓的渐进分析。

        

1.2.3 空间复杂度

这篇关于邓俊辉数据结构第一章:绪论笔记(未完待续)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/741840

相关文章

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓