今天很不开心,因为用matlab实现之前自己c++中实现的一部分代码,需要用到几种数据结构,比如图,队列,一时间不知如何下手,几番来回思考,完美的解决了这个问题
1.关于图
图是一种表示节点之间拓扑关系的数据结构,常用的表示方法有邻接矩阵和邻接表,邻接矩阵是空间换时间的做法,鉴于计算机内存的飞速发展,以及我也比较懒,所以就直接在matlab中声明一个
graph = zeros(totalNum, totalNum); % 邻接矩阵
此时,每个元素为0或1,比如graph(i,j)就表示节点i与j是否为邻接关系(也即二者之间有一条边)。
但若是在c++中我是这样实现的
typedef std::map<int, float> Neighbors; //key for 节点序号,value for 节点间边的权重
struct Vertex // 这是节点的定义,它保存的是其邻接节点,这不正是图的本质么,精髓啊
{
Neighbors neighbors;
};
typedef std::map<int, Vertex> Vertices; // 表示所有节点,外层直接访问它来获取节点
2.关于队列
stl中有queue,但matlab里没得啊,脑壳痛,于是想了一下,一开始我是这样实现的
queue = [];
queue(1) = []; % 出队
queue = [queue;val] % 入队
明眼人一看即知,这种实现会很慢,尤其是在对图做广度优先遍历的时候,没办法,发挥我的主观能动性,于是有了以下代码
queue = zeros(totalNum, 1); % 提前分好内存
queue(1) = initialVal; % 初值
queueTop = 1; % 队首
queueBack = 2; % 队尾,实际指向最后一个数的下一个
queue(1) = 0; queueTop = queueTop + 1; % 出队
queue(queueBack) = insertVal; queueBack = queueBack + 1; % 入队
实际上就是搞两个游标指向首尾,多简单,一时间忘了,不过经此一役,以后应该不会忘,哈哈!开心!