数据结构入门篇:第一篇

这篇具有很好参考价值的文章主要介绍了数据结构入门篇:第一篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据结构入门篇:第一篇

🤔首先,为什么要学数据结构?

数据结构的概念:在内存中对数据进行管理;
数据结构的学习能让我们在处理大量数据时提高处理效率,即让我们在不同的场景下更快的处理大量数据;
数据结构入门篇:第一篇

🤔算法和数据结构有什么关系?

算法就是处理数据的一种方法;
数据结构是为算法服务的,算法作用在特定的数据结构之上,而衡量数据结构和算法好坏的标准就是复杂度,即时间复杂度和空间复杂度;


1.时间复杂度

🤔什么是时间复杂度?

时间复杂度是衡量算法的快慢;

🤔🤔那么我们能不能把算法放到电脑上跑一跑,记录一下时间?

数据结构入门篇:第一篇
数据结构入门篇:第一篇

这样比较是很难比较出来算法的好坏,但又因为一个算法的语句执行次数与它所花费的时间成正比,所以我们把语句大概执行次数作为衡量一个算法的时间复杂度


👉算法时间复杂度的定义👈

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。


// 请计算一下Func1中++count语句总共执行了多少次?
void Func1(int N)
{
	int count = 0;
	for (int i = 0; i < N ; ++ i)
	{
 		for (int j = 0; j < N ; ++ j)
 		{
		 	++count;
 		}
	}

	for (int k = 0; k < 2 * N ; ++ k)
	{
		    ++count;
	}
	int M = 10;
	while (M--)
	{
 		    ++count;
	}
	printf("%d\n", count);
}

这里很容易算出这个数学表达式:F(N)=N2 +2*N+10;
Func1 执行的基本操作次数 :

  • N = 10 ——F(N) = 130
  • N = 100 ——F(N) = 10210
  • N = 1000 ——F(N) = 1002010

实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法

数据结构入门篇:第一篇

🤔🤔🤔什么是大O的渐进表示法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号;

大O的渐进表示法的规则:

  1. 如果一个算法的语句执行的次数是一个常数,那么可以表示为O(1);
  2. 如果一个算法的语句执行次数是一个高阶函数,那么只保留最高阶项;
  3. 如果最高阶项存在且不是1,则去除这个项的系数。得到的结果就是大O阶。
  4. 如果一个算法有最好,最坏,平均三种情况,那么取最坏的情况

总的来说就是要忽略对结果影响不是很大的项。
数据结构入门篇:第一篇


2.时间复杂度的练习

problem one:

void Func2(int N)
{
 	int count = 0;
 	for (int k = 0; k < 2 * N ; ++ k)
 	{
 		++count;
 	}
 	int M = 10;
 	while (M--)
 	{
	 	++count;
 	}
 	printf("%d\n", count);
}
  • 数学表达式:2*N+10
  • 时间复杂度(大O的渐进表示法):O(N)

problem two:

void Func3(int N, int M)
{
 	int count = 0;
 	for (int k = 0; k < M; ++ k)
 	{
 		++count;
 	}
 	for (int k = 0; k < N ; ++ k)
 	{
 		++count;
 	}
 	printf("%d\n", count);
}
  • 数学表达式:M+N
  • 时间复杂度(大O的渐进表示法):O(M+N),这里M和N并没确定关系,所以是M+N;

problem three:

void Func4(int N)
{
 	int count = 0;
 	for (int k = 0; k < 100; ++ k)
 	{
 		++count;
 	}
	printf("%d\n", count);
}
  • 数学表达式:100
  • 时间复杂度(大O的渐进表示法):O(1)

problem four:

void Swap(int* p,int* q)
{
	int tmp=*p;
	*p=*q;
	*q=tmp;
}
void BubbleSort(int* a, int n)
{
 	assert(a);
 	for (size_t end = n; end > 0; --end)
 	{
 		int exchange = 0;
 		for (size_t i = 1; i < end; ++i)
 		{
 			if (a[i-1] > a[i])
 			{
 				Swap(&a[i-1], &a[i]);
 				exchange = 1;
 			}
 		}
 		if (exchange == 0)
 			break;
 	}
}

👉这里是冒泡排序的详解

  • 数学表达式:
    最好的情况:有序数列,即N-1
    最坏情况:逆序,(N*(N-1))/2
  • 时间复杂度:取最坏情况,O(N2);

problem five:

int BinarySearch(int* a, int target, int x)
{
 	assert(a);
 	int left = 0;
 	int right = target-1;
 	// [begin, end]:begin和end是左闭右闭区间,因此有=号
 	while (left <= right)
 	{
 		int mid = (left + right)/2;
 		if (a[mid] < x)
 			left = mid+1;
 		else if (a[mid] > x)
 			right = mid-1;
 		else
 			return mid;
 	}
 	return -1;
}

以上是二分查找的代码;

数据结构入门篇:第一篇

  • 数学表达式:
    最好的情况下,在中间找到,即1
    最坏的情况是一直找找到只剩一个数,即N/2/2/2/2/2/…/2=1;

  • 时间复杂度运算过程:设x为大概的执行次数,即2x=N,那么解出x=logN,即时间复杂度是O(logN),:logN在算法分析中表示是底数为2,对数为N。


problem six:

long long Fac(size_t N)
{
 	if(0 == N)
 		return 1;
 	return Fac(N-1)*N;
}

数据结构入门篇:第一篇

  • 数学表达式:N+1
  • 时间复杂度:O(N)

problem seven:

// 计算斐波那契递归Fib的时间复杂度?
long long Fib(size_t N)
{
 	if(N < 3)
 		return 1;

 	return Fib(N-1) + Fib(N-2);
}

数据结构入门篇:第一篇

  • 数学表达式:2n-1-x
  • 时间复杂度:O(2N)

总结

以上就是本篇的所有内容了,今天主要学习了时间复杂度的计算,如果喜欢本篇不妨留个❤️;
数据结构入门篇:第一篇文章来源地址https://www.toymoban.com/news/detail-417489.html

到了这里,关于数据结构入门篇:第一篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 数据结构 队列(一篇基本掌握)

    数据结构 队列(一篇基本掌握)

            任其事必图其效;欲责其效,必尽其方。——欧阳修;本篇文章主要写的是什么是队列、以及队列是由什么组成的和这些组成接口的代码实现过程。( 大多细节的实现过程以注释的方式展示请注意查看 )    话不多说安全带系好,发车啦 (建议电脑观看) 。 附

    2024年02月12日
    浏览(9)
  • 数据结构(初阶)第一节:数据结构概论

    数据结构(初阶)第一节:数据结构概论

    本篇文章是对数据结构概念的 纯理论 介绍,希望系统了解数据结构概念的友友可以看看,对概念要求不高的友友稍做了解后移步下一节: 数据结构(初阶)第二节:顺序表-CSDN博客 目录 正文 1.数据结构的相关概念 1.1什么是数据 1.2什么是数据结构 1.3为什么需要数据结构 1

    2024年04月10日
    浏览(10)
  • 数据结构 二叉树(一篇基本掌握)

    数据结构 二叉树(一篇基本掌握)

    绪论         雄关漫道真如铁,而今迈步从头越。 本章将开始学习二叉树(全文共一万两千字),二叉树相较于前面的数据结构来说难度会有许多的攀升,但只要跟着本篇博客深入的学习也可以基本的掌握基础二叉树。    话不多说安全带系好,发车啦 (建议电脑观看)

    2024年02月14日
    浏览(9)
  • 一篇学完:王道考研408数据结构(全)

    一篇学完:王道考研408数据结构(全)

    PDF版本附在  lengyueling.cn 对应 文章结尾,欢迎下载访问交流 数据结构在学什么 如何用程序代码把现实世界的问题信息化 如何用计算机高效地处理这些信息从而创造价值 数据结构的基本概念 什么是数据: 数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到

    2023年04月08日
    浏览(13)
  • 【数据结构】一篇带你彻底了解栈

    【数据结构】一篇带你彻底了解栈

    栈:一种线性数据结构,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶 (Top), 另一端称为栈底 [Bottom]。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。即最后进入的元素最先被访问。 压栈:栈的插入操作叫做进栈/压栈

    2024年02月05日
    浏览(11)
  • 数据结构:一篇拿捏十大排序(超详细版)

    数据结构:一篇拿捏十大排序(超详细版)

    排序: 所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 稳定性: 假定在待排序的记录序列中,存在多个具有相同的的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前, 而

    2024年02月08日
    浏览(12)
  • 【数据结构】一篇带你彻底吃透 顺序表

    顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改等功能。 顺序表一般可以分为: 静态顺序表:使用定长数组存储元素。 动态顺序表:使用动态开辟的数组存储。 而现实的顺序表大多数采用动态

    2023年04月19日
    浏览(9)
  • 数据结构预习笔记第一章-数据结构的概念

    数据结构预习笔记第一章-数据结构的概念

    重点理解 数据结构的定义 , 逻辑结构 , 存储结构 , 算法的时间效率分析和算法的空间效率分析 2.1 什么是数据结构 概念😵 数据 :所有的数字,字符和能够被输入到计算机中进行运算的符号的集合。 数据元素 :数据元素是数据的 基本单位 ❗️,在计算机中通常是作为

    2024年01月25日
    浏览(10)
  • 第一章-数据结构绪论

    第一章-数据结构绪论

    数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。 程序设计的实质是选择一个好的结构,再设计一种好的算法。 数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处

    2024年02月13日
    浏览(12)
  • 408数据结构第一章

    1.数据 数据是信息的 载体 计算机程序 识别和处理 的符号的集合 2.数据元素 数据的 基本单位 整体 进行考虑和处理 若干 数据项 组成 数据项是构成元素的不可分割的 最小单位 3.数据对象 具有 相同性质 的数据元素的集合 4.数据类型 原子类型 结构类型 抽象数据类型 5.数据结

    2024年02月08日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包