C语言数据结构算法——时间复杂度

简介: 一,逻辑结构描述的是关系,与数据元素本身特点及计算机参数等没有关系。与数据元素本身的形式,内容,大小个数等无关的是数据的(B)A.存储结构 B.逻辑结构 C.储存实现 D.运算实现从逻辑上可以把数据结构分成(线性结构与非线性结构)下面那个是非线性数据结构的(A)A.树 B.字符串 C.队列 D.栈二,算法的五个特性:有穷,确定,可行,输入和输出.三,算法的四个评测准则:正确性,可读性,健硕性,高效性(用时间复杂度来判断)二三分析:给选项形容词前添加“不”字,如果可以接受,说明是评价准则,否则是必须满足的特性。如“不健壮”或“不高效”仍然是能作为一个算法的,只是变得不够完美。

一,逻辑结构描述的是关系,与数据元素本身特点及计算机参数等没有关系。

与数据元素本身的形式,内容,大小个数等无关的是数据的(B)

A.存储结构 B.逻辑结构 C.储存实现 D.运算实现

从逻辑上可以把数据结构分成(线性结构与非线性结构)

下面那个是非线性数据结构的(A)

A.树 B.字符串 C.队列 D.栈

二,算法的五个特性:

有穷,确定,可行,输入和输出.

三,算法的四个评测准则:

正确性,可读性,健硕性,高效性(用时间复杂度来判断)


二三分析:给选项形容词前添加“不”字,如果可以接受,说明是评价准则,否则是必须满足的特性。如“不健壮”或“不高效”仍然是能作为一个算法的,只是变得不够完美。但是“不可行”或“不确定”就无法容忍了,一个算法不可行或者无法给出确定的结果就不能称之为算法。

四,算法复杂度是一个保证,在给定输入规模的情况下,用O(数量级)表示。

  1. 分析下列算法(程序段)的时间复杂度:(代码理解什么是时间复杂度)
//算法输入:n和mintans=0;
for(inti=0; i<n; i+=1)
{
for(intj=0; j<m; j+=1)
{
ans+=1;
    }
}

在给定算法输入n和m的情况下,该嵌套循环内的语句将至多执行nm次,因此运行时间的上限,也及是时间复杂度是O(mn)。

  1. 分析下列算法时间复杂度:(怎么计算时间复杂度)
//算法输入:大小为n的数组nums,一个整数valfor (inti=0; i<n; i+=1){
if(nums[i] ==val){
returni;
    }
}

最坏的情况下,val位于nums的最后一位,循环内的if判断需要执行n次,因此时间复杂度为O(n)

,换句话说,这个算法保证在执行至多n次判断后就能结束.

  1. 分析下列算法时间复杂度:(规定执行次数怎么办?)
//算法输入:nfor (inti=0; i<n; i+=1){
if(i>1000)
break;
ans+=i;
}

无论输入n是多少,都循环至多执行1000次,因此时间复杂度为0(1000),也即常数复杂度不管这个常数多大,我们都认为他是0(1).

  1. 分析下列算法时间复杂度:(呈对数或线性关系分析)
//算法输入:nintans=0;
for (inti=1; i<=n; i+=1){
for (intj=1; j<n; j*=2){
ans+=i;
        }
}

内层循环(j)次数和n呈对数关系 →因此内层复杂度为0(log(n)).

外层循环(i)次数和n呈线性关系 →即执行n次0(log(n))的内层循环,得到0(n*log(n)).

  1. 分析下列算法时间复杂度:(内层循环的上限在变动
//算法输入:nintans=0;
for (inti=1; i<=n; i+=1){
for (intj=1; j<i; j+=1){
ans+=i;
        }
}

对i为0,1,2,......,n-1时,内层循环次数为:0,1,2,3,......,n-1求和得到的表达式中,最高阶的项是n²,因此整个表达式数量级是n²,即最终答案为O(n²)(内层循环的上限在变动)。

五.算法复杂度描述的是算法执行时间的增加和输入规模的增加呈何种关系。

  1. 在算法输入规模为n时,算法运行时间正比与9log(3的n次方),则该算法的时间复杂度为O(n).
  2. 9log(3的n次方) = 9nlog(3),对于算法的复杂度分析时,我们不关心常数和低阶项,只关心和输入规模n有关的数量级,因此0(9n*log(3)) → O(n)。

2.O(3n)是O(n)的三倍.

3.算法时间复杂度定义:

 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。其中f(n)是问题规模n的某个函数。

4.随着n的增加,算法执行的的语句次数将增加!!!


相关文章
|
3天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
45 9
|
22天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
58 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
17天前
|
存储 算法 C语言
通义灵码在考研C语言和数据结构中的应用实践 1-5
通义灵码在考研C语言和数据结构中的应用实践,体验通义灵码的强大思路。《趣学C语言和数据结构100例》精选了五个经典问题及其解决方案,包括求最大公约数和最小公倍数、统计字符类型、求特殊数列和、计算阶乘和双阶乘、以及求斐波那契数列的前20项和。通过这些实例,帮助读者掌握C语言的基本语法和常用算法,提升编程能力。
|
19天前
|
搜索推荐 算法
插入排序算法的平均时间复杂度解析
【10月更文挑战第12天】 插入排序是一种简单直观的排序算法,通过不断将未排序元素插入到已排序部分的合适位置来完成排序。其平均时间复杂度为$O(n^2)$,适用于小规模或部分有序的数据。尽管效率不高,但在特定场景下仍具优势。
|
7天前
|
存储 算法 数据管理
C语言算法复杂度
【10月更文挑战第20天】
C语言算法复杂度
|
2天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
32 16
|
2天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
28 8
|
4天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
26 4
|
6天前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
24 3
|
6天前
|
存储 算法 C语言
C语言数据结构(2)
【10月更文挑战第21天】