数据结构与算法_数据的表示

数据 – 程序的操作对象,用于描述客观事物 int a ,int b
数据的特点:
可以输入到计算机
可以被计算机程序处理

数据是一个抽象的概念,将其进行分类后得到程序设计语言中的类型。如:int,float,char等等
数据元素:组成数据的基本单位 array[1],array[2],这就是数据元素。
数据项:一个数据元素由若干数据项组成
数据对象 – 性质相同的数据元素的集合

数据的基本概念及研究意义

数据是一个抽象的概念,将其进行分类后得到程序设计语言中的类型。如:int,float,char等等
数据元素:组成数据的基本单位 array[1],array[2],这就是数据元素。
数据项:一个数据元素由若干数据项组成
数据对象 – 性质相同的数据元素的集合
下图是把数据结构的基本概念用一个图的关系进行了讲解,请看下图。
在这里插入图片描述

数据结构的逻辑关系

在这里插入图片描述
数据之间有四种关系,集合、线性、树形和图行。

数据的存储结构

顺序、链式、索引和散列
在这里插入图片描述

算法

算法是特定问题求解步骤的描述
在计算机中表现为指令的有限序列
算法是独立存在的一种解决问题的方法和思想
对于算法而言,语言并不重要,重要的是思想
算法和数据结构区别
数据结构只是静态的描述了数据元素之间的关系
高效的程序需要在数据结构的基础上设计和选择算法
程序=数据结构+算法

大O表示法

理论依据:
//算法最终要编译成计算机指令。
//每一个指令在具体的计算机上运行的时间是固定的。
//通过具体的N的步骤就可以推到出算法的时间复杂度。
//大O表示方法的推倒,

下面的代码是大O表示法在程序中的推倒过程。

long sum1(int n)     // 2*n+3   O(n)
{
	long ret = 0;                               // 1
	int* array = (int*)malloc(n * sizeof(int)); //1
	int i = 0;                    //1
	for (i = 0; i < n; i++)//n
	{
		array[i] = i + 1;
	}
	for (i = 0; i < n; i++)//n  
	{
		ret += array[i];
	}
	free(array);//1
	return ret;
}
long sum2(int n)// n+2   O(n)
{
	long ret = 0;
	int i = 0;
	for (i = 1; i <= n; i++)
	{
		ret += i;
	}
	return ret;
}

long sum3(int n)   // 2次     O(1)
{
	long ret = 0;
	if (n > 0)
	{
		ret = (1 + n) * n / 2;
	}
    	return ret;
}

程序分析,sum1执行了 2*n+3 次,sum2执行了n+2次,sum3执行了 // 2次。
所以sum1和sum2的时间复杂度是O(n),sum3的时间复杂度是O(1)

注意:
注意1:判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略。
注意2:在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度。
大O表示法:
算法效率严重依赖于操作(Operation)数量
在判断时首先关注操作数量的最高次项
操作数量的估算可以作为时间复杂度的估算
O(5) = O(1)
O(2n + 1) = O(2n) = O(n)
O(n2+ n + 1) = O(n2)
O(3n3+1) = O(3n3) = O(n3)

常见时间复杂度
在这里插入图片描述
关系
在这里插入图片描述

算法的空间复杂度

算法的空间复杂度通过计算算法的存储空间实现
S(n) = O(f(n))
其中,n为问题规模,f(n))为在问题规模为nn时所占用存储空间的函数
大O表示法同样适用于算法的空间复杂度
当算法执行时所需要的空间是常数时,空间复杂度为O(1)
空间与时间的策略
多数情况下,算法执行时所用的时间更令人关注
如果有必要,可以通过增加空间复杂度来降低时间复杂度
同理,也可以通过增加时间复杂度来降低空间复杂度。

空间换时间

把中间的运算结果缓存下来,这样的思想就是典型的控件换时间
算法思路如下:
在这里插入图片描述

void search(int a[], int len)
{
	int sp[1000] = { 0 };// 全部赋值0;
	int max = 0;
	for (int i = 0; i < len; i++) //利用数组元素和数组下标之间的关系
	{
		int index = a[i] - 1;
		sp[index]++;
	}
	for (int i = 0; i < 1000; i++)  //找到数组出现最多的一个数字,存到max中,
	{
		if (max < sp[i])
		{
			max = sp[i];
			cout << "出现最多的次数是:"<<max << endl;
		}
	}
	for (int i = 0; i < 1000; i++)
	{
		if (max == sp[i])
		{
			printf("%d\n", i + 1);
		}
	}

}

int main()
{
	int array[] = { 1,3, 1, 3, 4, 5, 100, 6, 6, 2, 3, 3, 3 };
	//cout <<"数组的长度"<< sizeof(array) << endl;   //数组的长度是52.
	//cout << "数组的类型" << sizeof(*array) << endl;   //数组的长度是52.
	int len = sizeof(array) / sizeof(*array);
	search(array, len);
	system("pause");
	return 1;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值