程序 = 数据结构 + 算法
数据结构是什么?
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 [1]
数据结构名词定义:
其中D是数据元素的集合,R是该集合中所有元素之间的关系的有限集合。 [2]
常用结构
数组、栈、队列、链表、树、图、堆、散列表。
算法
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
算法特征
算法分类
算法可大致分为基本算法、数据结构的算法、数论与代数算法、计算几何的算法、图论的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行算法,厄米变形模型,随机森林算法。
算法描述方式
描述算法的方法有多种,常用的有自然语言、结构化流程图、伪代码和PAD图等,其中最普遍的是流程图。
同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。
时间复杂度
算法的时间复杂度是指执行算法所需要的计算工作量。一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做。
T(n)=Ο(f(n))
因此,问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。
空间复杂度
算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。
练习:
百钱百鸡问题:公鸡一只:5钱,母鸡一只:3钱,鸡雏三只:1钱,百钱买百鸡,公鸡,母鸡,鸡雏各几只?
Code:
#include <stdio.h>
void main()
{
// cocks: 5, hens: 3, 3chicks:1
// 0<= cocks <= 19, 0<=hens<=33, 0<=chicks<=100
for (int i = 0; i <= 19; i++)
{
for (int j = 0; j <= 33; j++)
{
for (int k = 0; k <= 100; k++)
{
if (i * 5 + j * 3 + k / 3 == 100 && i + j + k == 100)
{
printf("cocks: %d 只,hens: %d 只, chicks: %d 只。 计算:i * 5 = %d, j * 3 = %d, k/3 = %d\n", i, j, k, i * 5, j * 3, k/3);
}
}
}
}
}