现在的位置: 首页 > 综合 > 正文

和arden一起学算法–第二天

2013年08月09日 ⁄ 综合 ⁄ 共 1780字 ⁄ 字号 评论关闭

                                                                基本数据结构


        我省略了一些东西直接跳到基本数据结构中。省略的主要是算法分析的一些原理,它告诉我们如何来有效评价一个程序的复杂度等等以及从数学角度上提供了一些用来做此度量的公式。这些东西跳过的主要原因是,我没底气 : )。这些东西一不小心说错了给人笑牙不说,自己至少要对自己负责不要对自己残忍,不胖打胖这样的事情非arden所为。
Ok,那我们开始数据结构吧。
今天我们来复习下已经很熟悉的几个结构:最底层结构、数组、链表、串。
最底层结构:整数、浮点、字符。每天拿在手里面玩,不用说了吧?让我们写一个结构当作毕业标志:
typedef struct point
{
float x;
float y;
} point;

再给一个计算点距离的函数:
float Distance(point a,point b)
{
float dx=a.x-b.x;
float dy=a.y-b.y;
return sqrt(dx*dx-dy*dy);
}

数组:数组之于基本在于它的底层特性,每个数组访问都可以使用有限几条机器码实现。它和内存有着直接的对应关系。(今天晚上不能上网,应该去google上查看下相关文献)
也给一个程序说事:
厄拉多塞筛sieve of Eratosthense:
此函数的实现基于一个数组a[i],若i为素数则a[i]=1,否则a[i]=0,首先都初始化为1表示没有已知的非素数。然后将已知为非素数的索引对应的数组元素设为0,如果将所有较小的素数的倍数都设为0后a[i]仍然为1则判断它为素数。
#define N 10000
main()
  { int i, j, a[N];
    for (i = 2; i < N; i++) a[i] = 1;
    for (i = 2; i < N; i++)
      if (a[i])
        for (j = i; j < N/i; j++) a[i*j] = 0;
    for (i = 2; i < N; i++)
      if (a[i]) printf("%4d ", i);
    printf("/n");
  }



链表:我们来看结构认识它。
typedef struct note *link;
struct note
{
Item item;
Link next;
};

    链表是一系列节点组成的数据结构。每个节点保存自己的数据以及访问下一项需要的信息,我们这里给出指向下一节点的指针。
此处使用图示表示。
链表的几种常见的操作应该很了解:删除、插入、倒置、排序。这些完全是在做指针游戏。实在晦涩自己画个图,看看指针变化的顺序就明白了。当然我们在实际编程中不会来取操作这些指针,因为即使很了解来回的使用指针即使很有经验的c程序员也不敢保证的百密而无一疏。好的办法是做接口将这些操作封装到函数中。
     如果要很好的驾驭链表需要明白链表实现的基本结构。需要知道在一味的自由增加减少自己的内存分配时,会导致什么样的结果有没有好的机制来优化它。
串: 串是变长度的字符数组。我觉得这样来定义已经很明了了。在处理串时我们可以使用索引也可以使用指针,即a[0] 和a 指向的是同一个内存位置而a[1]和a+1是等价的。数组和串本质上就是相同的东西。这个在任何一本比较全面的c++书籍上都会成为一个叙述的重点(c的书籍看的比较少不知道有没有)。所以我这里是很有体会哈。其实一个串的实现不一定要使用集成到系统中的实现,我们完全可以自己定义一个使用链表得到的串。
串和数组的区别在于串变长。串在系统中的内存分配是使用malloc和free这样的函数来实现的。    Strcpy是老掉牙的面试题目我们给两个形式的参考:
1 ---  Strcpy(a,b){for(int i=0; (a[i]=b[i])!=0;i++);}
2 ---  strcpy(a,b){while(*a++=*b++);}

    作为今天的毕业标志我们来写一个程序为一个二维数组初始化动态分配内存,next day我们将开始自己定义数据结构了:
int **malloc2d(int r, int c)
  { int i;
    int **t = malloc(r * sizeof(int *));
    for (i = 0; i < r; i++)
      t[i] = malloc(c * sizeof(int));
    return t;
  }


抱歉!评论已关闭.