算法与数据结构基础知识

      计算机要工作,首先要有数据,数据就是计算机加工和处理的对象;简单的分类一下,数据分为数值数据和非数值数据;数值数据主要应用于工程和科学计算;而非数值数据,比如声音,图像等在计算机中是以二进制形式存放在物理介质上。每个二进制位为一个bit,8个二进制位为一个byte(字节)。

    

      要谈数据结构,就必须了解数据类型(即一组值的集合和定义在该集合上的一组操作的总称。);数据类型分为原子数据类型和结构数据类型(复合数据类型)。所谓的结构数据类型就是指由原子数据类型或者由其他结构数据类型组成的数据类型。数据结构是指计算机存储组织数据的方式。数据结构的分类如下:线性结构(队列,链表,栈等等);非线性结构(树和图)。

      

       算法的设计取决于数据结构,而算法的实现依赖于数据结构。数据的操作是在数据结构之上定义的操作算法。所以说算法的设计离不开数据结构,但是,算法的设计也有本身的技巧和方法,下面是几种常见的算法设计策略。

      1.贪婪算法

      2.分治算法

      3.动态规划法

      4.回溯法

      5.概率算法

 

    

  一个算法设计出来之后,怎么样才知道效率如何,当然不能拿到机子上跑一遍吧,再说,即使拿到机子上跑一遍,因为机子配置等等原因,效率也是不一样的。所以要验证一个算法的效率如何一般都使用事前估计的方法。一个算法的好坏取决于两方面,第一:时间;第二:空间;所以把算法的复杂度分为时间复杂度和空间复杂度。这里简单介绍一下时间复杂度,空间复杂度可以类比。

    代码如下:

        for (int a = 0; a != num1; a++)

           {
               for(int b = 0; b != num2; b++)
                {
                  num[a][b] = b;
                }
          }

上面的代码出现了循环语句的嵌套,所以时间复杂度为O(num1*num2)。

 

      折半查找的算法代码如下:

Node* Find(const Type& x, Node* ptr)
{
   if(ptr == NULL)
   {
      return NULL;
   }
   else if(x < ptr->data)
          return Find(x,ptr->leftChild);

            else if(x > ptr->data)
                  return Find(x,ptr->rightChild);

                             else return ptr;
}

 

这个函数采用了递归的形式。 算法的时间复杂度为O(log2n)。

常见的程序时间复杂度如下图:

 

 

     

 

      

你可能感兴趣的:(算法与数据结构)