数据结构和算法开篇

如果说,熟练掌握编程语言是外功,那么数据结构可谓是内功心法了

以下是我学习数据结构的总结和一些笔记

数据结构(Data Structure)

  • 抽象数据类型(ADT)的物理实现
  • “数据结构”是计算机中存储,组织数据的方式。
  • “数据结构是数据对象”以及存在于该对象的实例和组成实例的数据元素之间的各种联系
  • 解决问题方法的效率跟数据的组织方式空间的利用效率算法的巧妙程度有关

例子1:

void PrintN( int N )
{
    int i;
    for( i=1 ; i<N ; i++)
    printf("%d\n",i);
    return;
}
void PrintN( int N )
{
    if( N )
    {
        PrintN(N-1);
        printf("%d\n",N);
    } 
    return;
}

这个程序前一个用了循环实现打印1-N,后面一个采用递归的方法实现的,很明显递归的效率很低,是因为,递归实现原理是以堆栈的方式,也就是说函数把 PrintN(N) 到PrintN(1)这N个函数压入栈中,在依次打印出来,内存消耗巨大。
图示:

内存图

例子2:

计算

多项式相加

double f(int n , double a[], double x)
{
    int i;
    double p = a[0];
    for( i=1 ; i<=n ; i++)
        p+= ( a[i] * pow( x , i ));
    return p;
}
double f(int n , double a[], double x)
{
    int i;
    double p = a[0];
    for( i=n ; i>0 ; i--)
        p= a[i-1] +x*p;
    return p;
}

在计算机中,有多次乘法与加法的运算时,一般按照权重,只需比较乘法次数就可以了,第一个算法每一次循环执行了i+1次乘法,一共执行了(N^2+3*N)/2次,第二种算法执行了N次乘法,显然第二种效率高,这就是算法的妙用

其实数据结构是由一些基本数据类型组合成了一个复杂的数据类型,用于解决某一类问题(基本问题有数据的增加,删除,条件查询,遍历等)

总结:到底什么是数据结构?

  • 数据对象在计算机中的组织方式

    1. 逻辑结构
    2. 物理存储结构
  • 数据对象必定与一系列加在其上的操作相关联

  • 完成这些操作所用的方法就是算法

抽象数据类型(Abstract Data Type)

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

算法

什么是算法?

  • 一个有限指令集
  • 接受一些输入(有些时候不需要输入)
  • 产生输出
  • 一定在有限步骤之后终止
  • 每一条指令必须

时间复杂度Tn

根据算法写成的程序在执行时占用存储单源的长度

空间复杂度Sn

根据算法写成的程序在执行时好费时间的长度

牛刀小试

用算法实现 求一个数列的最大子列和

题目一

给出下列四个算法:

//第一种算法:时间复杂度为 T(n^3)
int MaxSubseqSum1(int a[] , int N)
{
    int thisSum=0 , MaxSum=0;
        int i,j,k;
    for( i=0 ; i<N ; i++ )  /* i 是子列左端位置 */ 
        for( int j=i ; j<N ; j++ )   /* j是子列右端位置 */
        {   
            thisSum = 0;   /* thisSum 是从 a[i] 到 a[j] 的子列和 */
            for(int k=i;k<j;k++)thisSum+=a[k];
            /* 如果刚得到的这个子列和更大,则更新结果 */
            if(thisSum>MaxSum) MaxSum = thisSum;
        }
    return MaxSum;
} 
image.png
image.png
//最快的算法,时间复杂度为T(n)
int MaxSubseqSum1(int a[] , int N)
{
    int thisSum=0 , MaxSum = 0;
        int i;
    for( i=0 ; i<N ; i++)
    {
        thisSum+=a[i];     /* 向右累加 */
        /* 发现更大的则更新当前结果 */
        if(thisSum>MaxSum)MaxSum = thisSum;
       /* 如果当前子列和为负数,则不可能是后面的部分和增大,故舍弃 */
        else if(thisSum<0)thisSum=0;
    }
    return MaxSum;
}

算法三可以尝试写一下。
以上资料来源于 MOOC 《数据结构》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容