问题描述
在电路分析中,通常以图论为数学工具,进行建模,求解。
我们只研究二端元件,可以将电路中的每一个元件用一条边来表示,元件的端点用顶点来表示。
元件的端点和端点是可以连接在一起的,比如导线的端点连接器材的接线柱,当两个端点连接在一起时,我们怎么来存储端点之间的关系,如何执行连接和断开操作。
方法1 每个顶点维护一个数组,与该点连接的顶点存到数组里。连接一个顶点的时间复杂度是O(n)。
断开一个顶点的时间复杂度是O(n²)。(数组删除一个元素本身的时间复杂度是O(n))
存储所有顶点需要的空间是n²。
类似于邻接表。
实现起来比较复杂,有兴趣可以自己试试。
循环双向链表 循环双向链表可以自行搜索学习。连接一个顶点的时间复杂度是O(1)。
断开一个顶点的时间复杂度是O(1)。
存储所有顶点需要的空间是n。
一个节点:
多个节点:
实现代码如下:
class ListNode{
public next: ListNode;
public prev: ListNode;
constructor() {
this.next = this;
this.prev = this;
}
public destroy() {
this.next = null;
this.prev = null;
}
public connect(node: ListNode): void {
const next1: ListNode = this.next;
const next2: ListNode = node.next;
this.next = next2;
next2.prev = this;
node.next = next1;
next1.prev = node;
}
public disConnect(): void {
this.prev.next = this.next;
this.next.prev = this.prev;
this.next = this;
this.prev = this;
}
}
总结
显然使用循环双向链表无论是在时间上还是空间上都是最好的,而且实现起来很简单,不容易出错。
在后续的计算中,循环双向链表完全能够胜任。
数据结构和算法就像孙子兵法一样,背诵容易,实战很难。要做到在合适的场景应用合适的数据结构和算法,并能适当的进行结合、扩展。