01-简述

1. 几个经典算法题

字符串匹配

  • KMP算法(部分匹配表)

汉诺塔

  • 分治算法

八皇后

  • 回溯算法

马踏棋盘(骑士周游)

  • 图的深度优先遍历算法(DFS) + 贪心算法优化

2. 数据结构和算法的关系

2.1 数据结构

  • 解决存储问题
  • 把现实生活中大量而复杂的问题以特定的数据类型(事物)和特定的存储结构(事物的关系)保存到存储器中
  • 数据的存储 = 数据的存储 + 数据关系的存储

2.2 算法

  • 在存储结构的基础上实现某个功能而执行的操作,这个相应的操作也叫做 [算法] // 算法就是对数据的操作
  • 广义 | 狭义 上的算法

    狭义的算法:与数据的存储方式密切相关
    广义的算法:与数据的存储方式无关

2.3 关系

  • 程序 = 数据结构 + 算法
    ? ? ? ? = 数据的存储 + 数据的操作 + 可以被计算机执行的语言
  • 数据结构是算法的基础

3. 看几个实际编程中遇到的问题

  1. 试写出用单链表表示的字符串类及字符串结点类的定义,并依次实现它的构造函数、以及计算串长度、串赋值、判断两串相等、求子串、两串连接、求子串在串中位置等7个成员函数
    • 数据结构:单链表
  2. 五子棋程序:如何判断游戏的输赢,并可以完成 {存盘退出} 和 {继续上局} 的功能
    • 存盘退出:棋盘 → 二维数组 → 稀疏数组 → 写入文件
    • 继续上局:读取文件 → 稀疏数组 → 二维数组 → 棋盘
  3. 约瑟夫问题(丢手帕问题):设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列
    • 用一个不带头结点的循环链表来处理Josephu问题:先构成一个有n个结点的单循环链表(单向环形链表),然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束
  4. 修路问题
    • 最小生成树
    • 普利姆算法
  5. 最短路径问题
    • 弗洛伊德算法

4. 数据结构

4.1 线性结构

  • 有2种不同的存储结构

    顺序存储结构:逻辑关系上相邻的两个元素在物理位置上也相邻

    链式存储结构:一组任意的存储单元(离散存储);数据元素之间通过指针连接(即每个数据除了存储其本身的信息外,还需要存储一个指向其直接后继的指针 )

  • 常见的线性结构
    • 数组
    • 链表
    • 队列

4.2 非线性结构

  • 二维数组、多维数组
  • 广义表
  • 树 结构
  • 图 结构

相关推荐