【数据结构】复杂度(长期维护)

本篇博客主要是浅谈数据结构概念及时间复杂度,并做长期的维护更新,有需要借鉴即可。

一、初识数据结构

1.基础概念

数据结构(Data Structure) 是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。简单来说,数据结构就是在内存中管理数据。

相关概念拓展:
算法(Algorithm) 就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。简单来说,算法就是在磁盘中管理数据。

在内存与磁盘中管理数据的区别:
在内存中,

  • 数据存储速度比较快(相对磁盘而言)
  • 属于带点存储类型

相对应的,在磁盘中,

  • 数据存储速度比较慢(相对内存而言)
  • 属于不带点存储类型。

思考:带电与不带电存储对存储的影响是什么?
答:存储寿命
如果是需要带电存储,那么就需要不断电,那么也就意味这文件内容不能永久性存储;相应的,如果可以脱离电量进行存储,那么就可以永久性存储在硬件中(这里不考虑硬件寿命问题)。

2.如何学好数据结构

  • 画图
    在这里插入图片描述
  • 代码练习与思考
    在这里插入图片描述

二、复杂度

1.复杂度

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。

元素个数的逐渐增大,复杂度的差异逐渐明显
在这里插入图片描述
复杂度包括两个方面:

  • 时间复杂度
  • 空间复杂度

表示方法:
大O符号(Big O notation):是用于描述函数渐进行为的数学符号。

  1. 用常数1取代运行时间中的所有加法常数。
  2. 在修改后的运行次数函数中,只保留最高阶项。
  3. 如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
  4. 在实际中一般情况关注的是算法的最坏运行情况。

复杂度的意义何在?
用来衡量/决策比较某一种/多种实现方法的优劣
复杂度是准确的吗?
复杂度是粗略估计,对算法进行大致分“阶级”

2.时间复杂度

算法中的基本操作的执行次数,为算法的时间复杂度。

举例:

①有限数的时间复杂度

在这里插入图片描述

②函数的时间复杂度

在这里插入图片描述
注strchr:LINK

③二分查找时间复杂度

在这里插入图片描述
时间复杂度:O(logN)

④递归

在这里插入图片描述



在这里插入图片描述
在这里插入图片描述

拓展练习题1:消失的数字:LINK

在这里插入图片描述

在这里插入图片描述

int missingNumber(int* nums, int numsSize){

// //思路二:先加起来然后减去,即可得到消失的数字
// int i = 0;
// int lose = 0;
// int sum = 0;
// //加上0到numsSize全部的数字
// for(i = 0;i<numsSize+1;i++)
// {
//     sum+=i;
// }
// //减去原数组0到numsSize的数字
// for(i = 0;i<numsSize;i++)
// {
//     sum-=nums[i];
// }
// //得到消失的数字
// lose = sum;
// return lose;

//思路三:异或操作
int i = 0;
int lose = 0;
//异或正常的数组
for(i = 0;i<numsSize+1;i++)
{
    lose^=i;
}
//异或原来的数组
for(i = 0;i<numsSize;i++)
{
    lose^=nums[i];
}
//返回
return lose;
}

3.空间复杂度

为了实现某个功能额外开辟的空间。

需要注意的是:时间一去不复返,但是空间可以重复利用滴。

拓展练习题2:旋转数组

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

//旋转数组
void printArray(int arr[],int length)
{
	for (int i = 0; i < length; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

//1.暴力求解
void test1(int arr[],int length,int k)
{
	while (k--)
	{
		int temp = arr[length - 1];
		for (int i = length -1-1; i >= 0; i--)
		{
			arr[i+1] = arr[i];
		}
		arr[0] = temp;
	}
	printArray(arr, length);
}

void Swap(int arr[],int start,int end)
{
	while (start < end)
	{
		int temp = arr[start];
		arr[start] = arr[end];
		arr[end] = temp;
		start++;
		end--;
	}

}
//2.逆置法
void test2(int arr[], int length, int k)
{
	//1.首先逆置后半部分
	Swap(arr,length-k, length-1);
	printArray(arr, length);

	//2.其次逆置前半部分
	Swap(arr, 0, length - k - 1);
	printArray(arr, length);

	//3.整个数组进行逆置
	Swap(arr, 0, length - 1);

	printArray(arr, length);
}


//3.空间换时间方法
void test3(int arr[], int length, int k)
{
	//开辟空间
	int* temp = (int*)malloc(sizeof(int) * length);
	if (temp == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	
	//拷贝值到新数组中去
	for (int i = 0,j = k; i <= length - k - 1; i++,j++)
	{
		temp[j] = arr[i];
	}
	for (int i = length - k, j = 0; i <= length - 1; i++, j++)
	{
		temp[j] = arr[i];
	}

	//拷贝回去
	for (int i = 0; i < length; i++)
	{
		arr[i] = temp[i];
	}

	printArray(arr, length);
}

int main()
{
	int k = 3;
	int arr[] = { 1,2,3,4,5,6,7 };
	//test1(arr, sizeof(arr) / sizeof(int), k);
	//test2(arr, sizeof(arr) / sizeof(int), k);
	test3(arr, sizeof(arr) / sizeof(int), k);
	return 0;
}

EOF

相关推荐

  1. 数据结构——复杂

    2024-04-05 10:20:01       32 阅读
  2. 数据结构——A/复杂

    2024-04-05 10:20:01       47 阅读
  3. 数据结构——时间复杂

    2024-04-05 10:20:01       51 阅读
  4. 数据结构复杂计算

    2024-04-05 10:20:01       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-05 10:20:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-05 10:20:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-05 10:20:01       82 阅读
  4. Python语言-面向对象

    2024-04-05 10:20:01       91 阅读

热门阅读

  1. 使用generator实现async函数

    2024-04-05 10:20:01       28 阅读
  2. go中的常用的关键字

    2024-04-05 10:20:01       30 阅读
  3. Linux系统下tomcat服务自动重启

    2024-04-05 10:20:01       34 阅读
  4. 每天学习一个Linux命令之umount

    2024-04-05 10:20:01       36 阅读
  5. P1776宝物筛选

    2024-04-05 10:20:01       38 阅读
  6. Day1 单调数据结构

    2024-04-05 10:20:01       29 阅读
  7. 循环控制语句的实际应用(2)

    2024-04-05 10:20:01       34 阅读
  8. 安卓APP的开发:为了安全的设计

    2024-04-05 10:20:01       39 阅读
  9. C++11:lambda表达式 & 包装器

    2024-04-05 10:20:01       31 阅读