第一次认识数据结构
数据结构:在计算机科学中,数据结构是计算中存储、组织数据的方式。数据结构意味着接口或封装:一个数据结构可被视为两个函数之间的接口,或者是由数据类型联合组成的存储内容的访问方法封装。
典型的数据结构——二叉树:
在了解深层次数据结构之前还要理解一个概念——算法:在计算机科学之中,为任何良定义的具体计算步骤的一个序列,常用于计算、数据处理和自动推理。精确而言,算法是一个表示为有限长列表的有效方法。算法应包含清晰定义的指令用于计算函数。
算法特性:输入:算法具有零个或者多个输入
输出:只要有一个或多个输出
有穷性:算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且一个步骤在可接受的时间内完成。
确定性:算法的每一个步骤都有确定含义,不会出现义性
可行性:算法的每一步必须是可行的,也就是说,每一步都能够通过执行有限次数完成。
设计算法的要求:
正确性、可读性、健壮性、时间效率高且空间使用率低、简单性
时间复杂度:
计算机科学中,算法的时间复杂度是一个函数,它定性的描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度函数。时间复杂度常用大O表示,不包括这个函数的低阶项和首项系数。
由此我们可以看出计算时间复杂度的方法:
1、用常数1取代式中的所有加法常数
2、在修改后的运行次数函数中,只保留最高阶项
3、如果最高阶项系数存在且不是1,则去除与这个项相乘的常数
空间复杂度:
空间复杂度是度量算法所需存储空间的大小(算法的空间复杂度并不是计算实际占用的空间,而是计算整个算法的辅助空间单元的个数)记做S(n)=O(f(n))。简单来说空间复杂度就是程序在执行过程中创建了多少变量。
下面我们来计算一下时间复杂度和空间复杂度:
nt main()
{
int i = 0;
int j = 0;
int count = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
count++;
}
}//执行n*n次
for (i = 0; i < n; i++)
{
count++;
}//执行n次
int sum = 10;
while (sum--)
{
count++;
}//执行10次
return 0;
}
整个函数会执行n*n+n+10次根据时间复杂度的计算方法可得
O(n*n)
空间复杂度为O(1)
二分法的时间复杂度和空间复杂度:
int Binary_Search(int *dest,int len, int x)
{
int left = 0;
int right =len-1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (x == *(dest + mid))
{
return mid;
}
else if (x < *(dest + mid))
{
right = mid - 1;
}
else if (x > *(dest + mid))
{
left = mid + 1;
}
}
return -1;
}
所以时间复杂度为O(log2n)
由于辅助空间是常数级别的所以空间在复杂度为O(1)