数据结构学习笔记(一)
基于陈越姥姥的《数据结构》
基本概念
数据结构是计算机中存储、组织数据的方式。
例1:如何在书架上摆放图书?
问题解析:
- 新书怎么插入?
- 怎么找到指定的书?
解决方案
随便放
操作1:新书怎么插入?
哪里有空插哪里,一步到位。
操作2:怎么找到指定的书?
……工程量过大。
按照书名的拼音字母顺序排放。
操作1:遍历整个书库,再进行插入。
操作2:怎么找到指定的书?
二分查找法
把书架划分成几块区域,每块区域摆放着某种类别的图书;在每种类别内,按照书名的拼音字母顺序摆放。
操作1: 新书怎么插入?
先定类别,二分查找确定位置,移出空位
操作2:怎么找到某本指定的书?
先定类别,二分查找确定位置。
思考:空间如何分配?类别分多细?结合具体把握两者之间的平衡。
例2:写程序实现一个函数PrintN,使得传入一个正整数为N的参数后,能顺序打印从1到N的全部正整数。
C语言:
/*循环实现*/
#include<stdio.h>
void printN (int N)
{
int i ;
for (i=1;i<=N;i++){
printf("%d\n",i);
}
return ;
}
int main()
{
int a ;
printf("Please input a value:");
scanf("%d",&a);
printN(a);
return 0;
}
/*递归实现*/
#include<stdio.h>
void printN (int N)
{
if(N){
printN(N-1);
printf("%d\n",N);
}
}
int main()
{
int a ;
printf("Please input a value:");
scanf("%d",&a);
printN(a);
return 0;
}
Python语言:
# -*- coding: utf-8 -*-
"""
Created on 2017.6.10
循环实现
@author: jiang
"""
def printN (N):
for i in range(0,N):
print(i)
a = input("please input a value:")
printN(int(a))
# -*- coding: utf-8 -*-
"""
Created on 2017.6.10
递归实现
@author: jiang
"""
def printN (N):
if N != 0:
printN(N-1)
print(N)
a = input("please input a value:")
printN(int(a))
例3:写程序计算给定多项式在给定
x
处的值,
程序运行时间测量:
C语言:
#include <stdio.h>
#include <time.h>
#include <math.h>
#define MAXN 10
#define MAX 1e7
clock_t start,stop;
double duration;
double f1(double x , double a[],int n );
double f2(double x ,double a[], int n);
double f1(double x , double a[],int n )
{
int i ;
double p = a[0];
for(i=0;i <= n;i++)
p += (a[i] * pow(x,i));
return p;
}
double f2(double x, double a[], int n)
{
int i;
double p = a[n];
for(i=n;i >= 0;i--)
p += (a[i-1]+ x*p);
return p;
}
/*
//clock_t 是clock()函数返回的变量类型
clock_t start,stop;
/* clock_t 是clock()函数返回的变量类型 */
double duration;
/* 记录被测函数运行时间,以秒为单位 */
int main()
{ /* 不在测试范围内的准备工作卸载clock调用之前 */
start = clock(); /*开始计时*/
MyFunction(); /*把被测函数放在这里*/
stop = clock(); /*停止计时*/
duration = ((double)(stop - start))/CLK_TCK;
/*计算运行时间*/
/*其他不在测试范围的处理写在后面。例如输出duration的值 */
return 0;
*/
int main()
{
int i;
double a[MAXN];
for ( i=0; i<MAXN; i++ ) a[i] = (double)i;
start = clock();
for(i= 0;i<MAX;i++)
f1(1.1,a,MAXN-1);
stop = clock();
duration = ((double)(stop - start))/CLK_TCK;
printf("ticks1 = %f\n",(double)(stop - start));
printf("duration = %6.2e\n",duration);
start = clock();
for(i= 0;i<MAX;i++)
f2(1.1,a,MAXN-1);
stop = clock();
duration = ((double)(stop - start))/CLK_TCK;
printf("ticks2 = %f\n",(double)(stop - start));
printf("duration2 = %6.2e\n",duration);
return 0;
}
启示:
解决问题方法的效率,和数据的组织方式有关。
什么是数据结构?
- 数据对象在计算机中的组织方式
- 逻辑结构
- 物理存储结构
- 数据对象必定与一系列加在其上的操作相关联
- 完成这些操作所用的方法就是算法
抽象数据类型(Abstract Data Type)
- 数据类型
- 数据对象集
- 数据集合相关联的操作集
- 抽象:描述数据类型的方法不依于具体实现
- 与存放数据的机器无关
- 与数据存储的物理结构无关
- 与实现操作的算法和编程语言无关