数据结构学习笔记(一)

数据结构学习笔记(一)

基于陈越姥姥的《数据结构》

基本概念

数据结构是计算机中存储、组织数据的方式。

例1:如何在书架上摆放图书?

问题解析:

  • 新书怎么插入?
  • 怎么找到指定的书?

解决方案

  1. 随便放

    • 操作1:新书怎么插入?

      哪里有空插哪里,一步到位。

    • 操作2:怎么找到指定的书?

      ……工程量过大。

  2. 按照书名的拼音字母顺序排放。

    • 操作1:遍历整个书库,再进行插入。

    • 操作2:怎么找到指定的书?

      二分查找法

  3. 把书架划分成几块区域,每块区域摆放着某种类别的图书;在每种类别内,按照书名的拼音字母顺序摆放。

    • 操作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 处的值,f(x)=a0+a1x++an1xn1+anxn

程序运行时间测量:

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)

  • 数据类型
    • 数据对象集
    • 数据集合相关联的操作集
  • 抽象:描述数据类型的方法不依于具体实现
    • 与存放数据的机器无关
    • 与数据存储的物理结构无关
    • 与实现操作的算法和编程语言无关
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值