当前所在位置:珠峰网资料 >> 计算机 >> 软件水平 >> 正文
2015年初级软考辅导:程序员数据结构笔记(一)
发布时间:2010/3/13 14:15:31 来源:城市学习网 编辑:MOON
  能听到周SIR讲课真的挺开心的,我觉得他讲课比某些高程还深动,为了考中程,上学期的<算法分析>选修课我也去揍了揍热闹.可惜由于SARS的关系,课只上了将近一半就停了.可以说我报程序员的原因就是因为有周SIR开导我们,听他的课真的是一种享受,不像大学里的某些人,水平不怎么高还在这里作威作福.
  好了,发了这么多劳骚,开始转入正题了.
  读这文章的人想必都是想报考或者将考程序员的同志们吧!首先一点必须问问自己,我考程序员的目的到底是为了什么?如果你的答案是:"只是为了拿一本证书".那我劝你早点GIVEUP吧!那样学起来会很累,因为没有兴趣.如果你想加入程序员的行列,为将来开发打下坚实的基础,那就试着看完这一小篇读书笔记吧!或许会对你有所帮助.
  有句话必须记住:程序员考试仅仅是为了检验自己学到的而已,仅此而已!我想这便是程序员考试的最终意义所在吧!有些事情更注重过程!
  数据结构
  知识:
  1.数据结构中对象的定义,存储的表示及操作的实现.
  2.线性:线性表、栈、队列、数组、字符串(广义表不考)
  树:二叉树
  集合:查找,排序
  图
  能力:
  分析,解决问题的能力
  过程:
  确定问题的数据。
  确定数据间的关系。
  确定存储结构(顺序-数组、链表-指针)
  确定算法
  编程
  算法评价(时间和空间复杂度,主要考时间复杂度)
  一、数组
  1、存放于一个连续的空间
  2、一维~多维数组的地址计算方式
  已知data[0][0]的内存地址,且已知一个元素所占内存空间S求data[i][j]在内存中的地址。
  公式:(add+S)
  注意:起始地址不是data[0][0]时候的情况。起始地址为data[-3]和情况;
  3、顺序表的定义
  存储表示及相关操作
  4、顺序表操作中时间复杂度估计
  5、字符串的定义(字符串就是线性表),存储表示
  模式匹配算法(简单和KMP(不考))
  6、特殊矩阵:存储方法(压缩存储(按行,按列))
  三对角:存储于一维数组
  三对角问题:已知Aij能求出在一维数组中的下标k;已知下标k求Aij。
  7、稀疏矩阵:定义,存储方式:三元组表、十字链表(属于图部分,不考)
  算法
  数组中元素的原地逆置;对换
  在顺序表中搜索值为X的元素;
  在有序表中搜索值为X的元素;(折半查找)
  在顺序表中的第i个位置插入元素X;
  在顺序表中的第i个位置删除元素X;
  两个有序表的合并;算法?
  线性表数据结构定义:
  Typedefstructlinear_list;
  模式匹配
  字符串相加
  求子串
  (i,j)<=>K注意:不同矩阵所用的公式不同;
  稀疏矩阵的转置(两种方式,后种为妙)
  和数组有关的算法
  例程:求两个长整数之和。
  a=13056952168
  b=87081299
  数组:
  a:13056952168
  b:87081299
  由于以上的结构不够直观将其改为:
  a:1186125965031a[0]=11
  b:899218078000b[0]=8
  c进位01100111100
  c:1176433044231c[0]的值由c[max_s+1]决定!
  注意:在求C前应该将C位赋0.否则为随机数;较小的整数高位赋0.
  算法:已知a,b两个长整数,结果:c=a+b;
  总共相加次数:max_s=max
  程序:
  for
  求c位数:
  if
  c[0]=max_s;
  else
  c[0]=max_s+1;
  以下代码是我编的:
  /两长整数相加/
  #include<stdio.h>
  #include<string.h>
  #definePRINprintf;
  intflag=0;/a[0]>b[0]?1:0/
  /max/
  change
  else
  }
  add
  if
  c[0]=a[0];
  else
  c[0]=a[0]+1;
  }
  else
  if
  c[0]=b[0];
  else
  c[0]=b[0]+1;
  }
  }
  voidprint
  main;
  chardb=;
  a[0]=strlen;
  b[0]=strlen;
  printf;
  printf;PRIN
  change;
  printf;PRIN
  printf;
  if
  else
  add;
  printf;
  print;
  }
  时间复杂度计算:
  确定基本操作
  计算基本操作次数
  选择T
  lim/T)=c
  0)为时间复杂度
  上例子的时间复杂度为O;
  二:链表
  1、知识点
  逻辑次序与物理次序不一致存储方法;
  单链表的定义:术语(头结点、头指针等)
  注意带头结点的单链表与不带头结点的单链表区别。(程序员考试一般不考带头结点,因为稍难理解)
  插入、删除、遍历(p==NULL表明操作完成)等操作
  循环链表:定义,存储表示,操作;
  双向链表:定义,存储方法,操作;
  单链表和循环链表区别在最后一个指针域值不同。
  2、操作
  单链表:插入X,删除X,查找X,计算结点个数
  单链表的逆置(中程曾考)
  head->NULL/p->a1/p->a2/p->a3/p……an/NULL注:p代表指针;NULL/p代表头结点
  =》head->NULL/p->an/p->an-1/p->an-2/p……a1/NULL
  循环链表的操作:插入X,删除X,查找X,计算结点个数;
  用p=head->next来判断一次计算结点个数完成;
  程序段如下:
  k=0;
  dowhile;
  双向链表
  多项式相加
  有序链表合并
  例程:已知两个字符串S,T,求S和T的最长公子串;
  1、逻辑结构:字符串
  2、存储结构:数组
  3、算法:精化(精细化工)老顽童注:此处“精细化工”说明好像不对!
  s="abaabcacb"
  t="abdcabcaabcda"
  当循环到s.len-1时,有两种情况:s="abaabcacb"、s="abaabcacb"
  s.len-2时,有三种情况:s="abaabcacb"、s="abaabcacb"、s="abaabcacb"
  .
  .
  .
  1s.len种情况
  程序思路:
  tag=0//没有找到
  for
  长度为l的s的子串在s中有(s.len-l+1)个。
  子串0:0~l-1
  1:1~l
  2:2~l+1
  3:3~l+2
  ……
  ……
  s.len-l:s.len-l~s.len-1
  由上面可得:第j个子串为j~l+j-1。
  判断长度为l的s中的子串是否为t的子串:
  for
  模式结构:
  tag=0;
  for
  }
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved