数据结构与算法的实现 —— 结点定义与数据结构的选择

0. 举例

  • 多项式:

    class PolyTerm {
    	double coef;
    	double exponent;
    }
    // PolyTerm[] 数组表示一个多项式;
    
    PolyTerm[] polySum(PolyTerm[] poly1, PolyTerm[] poly2) {
    	...
    }
    

1. 图

  • 最小生成树(MST),

    比如在对使用( Kruskal 或 Prim)算法得到的最小生成树进行表示时,其实是把最小生成树(MST)当做一些列边的集合,进行存储。对于边而言,具有三个属性,分别是起点 v i v_i vi 和终点 v j v_j vj,以及边上的信息比如权值 w w w。也即最小生成树是边的集合,而边的形式是 ( ( v i , v j ) , w ) ((v_i,v_j), w) ((vi,vj),w)

  • Kruskal 算法

    reps = range(vnum)
    

    使用一维数组为每一个连通分量确定一个代表元,
    连通分量与唯一的代表元对应,或者说连通分量交由代表元表示;

  • Prim 算法:

    将从已访问过的结点 U U U,到未访问过的结点 V − U V-U VU,之间的边放入优先队列(小顶堆实现),每次都选择权值最小的;

2. 自定义的结点

template <typename K, typename V>
struct Entry{
	K key; V value;
	Entry(K k = K(), V v = V()) :key(k), value(v){}
	Entry(const Entry<K, V>& e) :key(e.key), value(e.value){}
	bool operator<(const Entry<K, V>& e) { return key < e.key; }
	bool operator>(const Entry<K, V>& e) { return key > e.key;  }
	bool operator==(const Entry<K, V>& e) { return key == e.key;  }
	bool operator!=(const Entry<K, V>& e) { return key != e.key; }
};

这样的重载了基本简单运算符重载的键值对(key-value pair)词条类有什么意义呢,就是有些特定问题下用到的特殊数据结构内部存储的未必是基本数据类型(比如 int、float 等可比较数据类型),而也可能存储的是一些较为复杂的键值对、结构体或者其他自定义的类。当存储在优先队列(大/小顶堆)或者二叉搜索树等数据结构时,需要这些复杂的元素支持比较特定的比较运算符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值