循序渐进学数据结构(算法)

1.算法

是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

2.算法的比较

下面是一个栗子:求和的算法比较。

//普遍求和
int i, sum = 0, n = 100;
for (i = 1; i <= n; i++)
{
    sum += i;
}
MessageBox.Show(sum.ToString());

//高斯求和
int sum = 0, n = 100;
sum = (1 + n) * n / 2;
MessageBox.Show(sum.ToString());

可以很明显的看出,第一种方法for循环内部执行了n次,第二种方法只执行了1次。

可能n为100,两者之间性能差异很小,如果是10000000000000000000000000000000这样呢?结果可想而知。

3.算法的特性

  1. 输入输出:零个或多个输入,一个或多个输出;
  2. 有穷性:会自动结束而不会无限循环;
  3. 确定性:每一步都有确定的含义,不会出现不二性;
  4. 可行性:每一步都必须可行,执行有限次数完成。

4.算法设计的要求

  1. 正确性

    • 算法程序没有语法错误
    • 算法程序对于合法的输入数据能够产生满足要求的输出结果。
    • 算法程序对于非法的输入数据能够得出满足规格说明的结果。
    • 算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果。
  2. 可读性:算法设计的另一个目的是为了便于阅读、理解和交流
  3. 健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果
  4. 时间效率高和存储量低
    • 效率:对于同一个问题,如果有多个算法可以解决,执行时间短的算法效率高,执行时间长的效率低。
    • 存储量:存储量需求指的是算法在执行的过程中需要的最大存储空间,主要指算法程序运行时所占用的内存或外部硬盘存储空间。

5.算法效率的度量方法

  1. 事后统计方法:通过设计好的测试程序和数据,利用 计算机计数器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。(缺陷多,不予考虑)
  2. 事前分析估算方法:在计算机程序编制之前,依据统计方法对算法进行估算。

  一个高级程序设计语言编写的程序在计算机上运行所消耗的时间取决于下列因素:

  1. 算法采用的策略、方法(根本)
  2. 编译产生的代码质量(软件)
  3. 问题的输入规模(即输入量的多少)
  4. 机器执行指令的速度(硬件性能)

  分析一个算法的运行时间,要将基本操作数量与输入规模关联起来

  比如上面的例子,第一种方法两者是线性的规模为n,操作数量为n,第二种方法无论规模n为何值,操作数量都为1,若再此基础上加上一个双层循环,操作数量为n的平方,他们的关系如下图所示:

6.函数的渐进增长

  给定f(n),g(n),若存在一个整数N,使得所有的n>N,f(n)总大于g(n),则称f(n)的渐进增长快于g(n);

  举个栗子:

f(n) g(n) N
2n+3 3n+1 2
4n+8 2n2+1 3

  当n趋近于无限大的时候,我们可以认识到有些数值不会影响我们最终的判断,可以省略

  1. 可以忽略加法常熟
  2. 可以忽略与最高次项相乘的常数

  我们主要关注的事最高阶项的阶数,指数越大,增长越快。

7.算法的时间复杂度 

  T(n)=O(f(n))表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。其中f(n)是问题规模n的某个函数。(大O记法)。

  一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。

  O(1)叫常数阶、O(n)叫线性阶、O(n2)叫平方阶。

推导大O阶方法(如何分析算法的时间复杂度)

  1、用常数1取代运行时间中的所有加法常数。

  2、在修改后的运行次数函数中,只保留最高阶项。

  3、如果最高阶项存在且不是1,则去除与这个项相乘的常数。

  举个栗子:

    3n3+2n2+n+10 => O(n3+1)

    log2n => O(logn)

  常用的时间复杂度所耗费的时间从小到大依次是:

  O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)

8.算法空间复杂度

  S(n)=O(f(n))   n为问题的规模,f(n)为语句关于n所占存储空间的函数

 

时间: 2024-11-08 17:05:16

循序渐进学数据结构(算法)的相关文章

前端要不要学数据结构&amp;算法

我们都知道前端开发工程师更多偏向 DOM 渲染和 DOM 交互操作,随之 Node 的推广前端工程师也可以完成服务端开发.对于服务端开发而言大家都觉得数据结构和算法是基础,非学不可.所以正在进行 Node 开发的同学而言,这个答案跃然纸上.我们今天重点说一说纯前端开发的同学到底需不要数据结构与算法. 我先说下结论:需要,非常需要. 第一,只要是程序员,基本功都是数据结构与算法 从我们接触编程的时候就知道一个理论,程序=数据结构+算法.所以,只要写的是程序,就离不开数据结构和算法.当然,有的同学会

从头开始学数据结构!!!!嘤嘤嘤,第一节介绍和算法

1.程序设计=数据结构+算法   所以想在程序设计竞赛中获得成绩,数据结构必须学好.不论考研还是以后工作. 数据(人类)->数据元素(人)->数据项(耳朵,鼻子,等器官),数据项是数据的不可分割的最小单位. 相同数据元素的集合称之为数据对象. 2.数据结构:是相互之间存在一种或多种特定关系的数据元素的集合. 数据结构分为逻辑结构和物理结构: 逻辑结构分为四种:集合结构,线性结构(一对一),树形结构(一对多的层次关系),图形结构(多对多). 物理结构:顺序存储结构(数据间的逻辑关系和物理关系一致

学数据结构,是不是一定要先学离散数学

[问题的来源] 有<数据结构基础>网络课程的学员给我提问: 哈夫曼树是不是都是双分支,没有单分支的?有点不太懂这个哈夫曼树的构造过程,为什么要这样构造?只知道这样会让权值大的叶节点靠近根节点,小的叶节点远离根节点,为什么权值可以相加再比较呢? 我的答复是: 所有叶节点,都是原给定的节点:所有分支节点,度均为2,所以没有单分支. 很高兴看到你能提出这么多的为什么,然而在数据结构这门课程中,更注重是什么,怎么做的问题,也只能讲到这个层面了,为什么的事情,建议找"离散数学"教材,

初转java随感(一)程序=数据结构+算法

大学刚学编程的时候,有一句很经典的话程序=数据结构+算法 今天有了进一步认识. 场景: 1.当前局面 (1)有现成的封装好的分页组件 返回结果是page.类型为:Page.包括 page 分页信息,data 数据列表 List型. (2)查询了一个数据列表 midResult.类型为 List<Map<String,Object>> . 2.想要的结果 现在想把page midResult 两个结果集进行处理.返回页面. 3.解决问题 首先纠结的是,用哪种类型来存储数据.用List

小朋友学数据结构(5):顺序查找法

小朋友学数据结构(5):顺序查找法 查找是最常见的数据操作之一,也是数据结构的核心运算之一,其重要性不言而喻. 顺序查找是最简单的查找策略,对于小规模的数据,顺序查找是个不错的选择. (一)基本思想 从数据的第一个元素开始,依次比较,直到找到目标数据或查找失败. 1 从表中的第一个元素开始,依次与关键字比较. 2 若某个元素匹配关键字,则查找成功. 3 若查找到最后一个元素还未匹配关键字,则查找失败. 1.png (二)时间复杂度 顺序查找平均关键字匹配次数为表长的一半,其时间复杂度为O(n).

小朋友学数据结构(10):基数排序

小朋友学数据结构(10):基数排序 一.基本思想 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零.然后,从最低位(即个位数)开始,依次进行一次排序.这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列. 与其他排序不同的是,基数排序不涉及数的交换. 基数排序是一种稳定的排序算法. 8.png 二.主要步骤 从上面的计算过程,咱们可以看出,基数排序主要有三个步骤: 1.把所有元素都分配到相应的桶中(因为整数每位数有0~9共十种可能,所以通常需要10个桶) 2.把

小朋友学数据结构(7):快速排序

小朋友学数据结构(7):快速排序 一.快速排序 (一)基本思想 选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分. (二)例子 6-1.png 以{5, 9, 2, 7 ,8, 3, 6, 1, 4, 0}为例. 选择第0个元素5作为参照数,咱们第一步的目标是把比5小的数都调整到5的左边,比5大的数都调到5的右边. (1)从左往右开始观

小朋友学数据结构(9):希尔排序

小朋友学数据结构(9):希尔排序 (一)基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. (二)例子 有一个数组,其原始数组为: 2-1.png 取初始增量gap = length / 2 = 5,这样就将整个数组分为5组(每组用相同的颜色表示) 2-2.png 将这5组的数据分别按由小到大的顺序排列,结果为 2-3.png 缩小增量gap = gap / 2 = 2,整

小朋友学数据结构(4):归并排序

小朋友学数据结构(4):归并排序 (一)基本思想 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 7-1.jpg (二)代码实现 import java.util.Arrays; public class Sort { public static void mergeSort(int[] array) { sort(array, 0, array.length - 1); } p