Example #1
0
 def test_remove_range(self):
     t = Vector()
     t.copyFrom([0, 1, 2, 3, 4, 5, 6], 0, 7)
     t.remove_range(3, 5)
     self.assertEqual(t[:], [0, 1, 2, 5, 6])
     t.remove(0)
     self.assertEqual(t[:], [1, 2, 5, 6])
Example #2
0
 def test_insert(self):
     t = Vector()
     t.insert(0, 1)
     t.insert(0, 3)
     t.insert(1, 5)
     t.insert(5, 10)
     self.assertEqual(t[:], [3, 5, 1, 10])
Example #3
0
 def insertV(self, vertex: Vertex):  # 插入顶点
     for j in range(self.n):
         self.__E[j].insert(None)  # 各顶点增加一个边记录位置
     self.n += 1
     self.__E.insert(self.n, Vector().copyFrom([None] * self.n, 0,
                                               self.n))  # 增加新的顶点向量
     return self.__V.insert(self.n, vertex)  # 增加新顶点
Example #4
0
 def test_bin_search(self):
     t = Vector()
     t.copyFrom([0, 1, 2, 3, 4, 5, 6], 0, 7)
     self.assertEqual(t.binSearch(0), 0)
     self.assertEqual(t.binSearch(3), 3)
     self.assertEqual(t.binSearch(6), 6)
     self.assertEqual(t.binSearch_A(0), 0)
     self.assertEqual(t.binSearch_A(4), 4)
     self.assertEqual(t.binSearch_A(6), 6)
Example #5
0
 def __init__(self):
     self.n = 0  # 顶点数
     self.e = 0  # 边数
     self.__V = Vector()  # 顶点集合
     self.__E = Vector()  # 边集合
Example #6
0
class GraphMatrix:  # 基于向量,邻接矩阵实现图
    def __init__(self):
        self.n = 0  # 顶点数
        self.e = 0  # 边数
        self.__V = Vector()  # 顶点集合
        self.__E = Vector()  # 边集合

    def reset(self):
        for i in range(self.n):
            self.vertex(i).status = VStatus.UNDISCOVERED
            self.vertex(i).dTime = -1
            self.vertex(i).fTime = -1
            self.vertex(i).parent = -1
            self.vertex(i).priority = float('inf')
            for j in range(self.n):
                if self.exists(i, j):
                    self.__E[i][j].type = EType.UNDETERMINED

    def vertex(self, i):
        return self.__V[i]

    def vertex_data(self, i):
        return self.__V[i].data

    def inDegree(self, i):
        return self.__V[i].InDegree

    def outDegree(self, i):
        return self.__V[i].outDegree

    def firstNbr(self, i):
        return self.nextNbr(i, self.n)

    def nextNbr(self, i, j):
        for j in range(j - 1, 0, -1):
            if self.exists(i, j):
                return j
        return -1

    def exists(self, i, j):  # i到j的边是否存在
        return 0 <= i <= self.n and 0 <= j <= self.n and self.__E[i][
            j] is not None

    def status(self, i):
        return self.__V[i].status

    def dTime(self, i):
        return self.__V[i].dTime

    def fTime(self, i):
        return self.__V[i].fTime

    def parent(self, i):
        return self.__V[i].parent

    def priority(self, i):
        return self.__V[i].priority

    def insertV(self, vertex: Vertex):  # 插入顶点
        for j in range(self.n):
            self.__E[j].insert(None)  # 各顶点增加一个边记录位置
        self.n += 1
        self.__E.insert(self.n, Vector().copyFrom([None] * self.n, 0,
                                                  self.n))  # 增加新的顶点向量
        return self.__V.insert(self.n, vertex)  # 增加新顶点

    def removeV(self, i):  # 删除第i个顶点及其关联的边
        for j in range(self.n):  # 所有出边
            if self.exists(i, j):  # 存在
                self.__E[i][j] = None  # 删除出边,可选,后续删除整条边
                self.__V[j].inDegree -= 1  # 顶点J入度-1
        self.__E.remove(i)  # 删除i的边数据
        self.n -= 1
        vBak = self.vertex(i)  # 需要删除的顶点备份
        self.__V.remove(i)  # 删除顶点
        for j in range(self.n):
            if not self.__E[j][i] is None:  # 判断第j的顶点是否有到i的边
                self.__E[j][i] = None  # 有边时删除
                self.__V[j].outDegree -= 1  # 出度减1
        return vBak

    def type(self, i, j):
        return self.__E[i][j].etype

    def edge(self, i, j):  # 方便后续程序修改值,将边对象直接返回
        return self.__E[i][j]

    def edge_data(self, i, j):
        return self.__E[i][j].data

    def weight(self, i, j):
        return self.__E[i][j].weight

    def insertE(self, edge: Edge, i, j):  # 插入i到j的边
        if self.exists(i, j): return  # 边存在则不做任何处理)
        self.__E[i][j] = edge
        self.e += 1
        self.__V[i].outDegree += 1
        self.__V[j].inDegree += 1

    def removeE(self, i, j):  # 移除i到j的边
        eBak = self.edge(i, j)
        self.__E[i][j] = None
        self.e -= 1
        self.__V[i].outDegree -= 1
        self.__V[j].inDegree -= 1
        return eBak

    def __getitem__(self, item: int):
        return self.__V[item]
Example #7
0
 def test_find(self):
     t = Vector()
     t.copyFrom([5, 4, 3, 2, 1, 5], 0, 6)
     self.assertEqual(t.find(5), 0)
     self.assertEqual(t.find(10), -1)
     self.assertEqual(t.find(5, 1, t.size()), 5)
Example #8
0
 def test_sort(self):
     t = Vector()
     t.copyFrom([0, 1, 2, 3, 4, 5, 6], 0, 7)
     t.permute()
     t._bubbleSort()  # 冒泡排序
     self.assertEqual(t[:], list(range(7)))
     t.permute()
     t._selectSort()  # 选择排序
     self.assertEqual(t[:], list(range(7)))
     t.permute()
     t._mergeSort()  # 归并排序
     self.assertEqual(t[:], list(range(7)))
     t.permute()
     t.quickSort()  # 快速排序
     self.assertEqual(t[:], list(range(7)))
Example #9
0
 def test_uniquify(self):
     t = Vector()
     t.copyFrom([0, 1, 1, 2, 3, 4, 5, 5], 0, 8)
     s = t.uniquify()
     self.assertEqual(t[:], [0, 1, 2, 3, 4, 5])
     self.assertEqual(s, 2)
Example #10
0
 def test_deduplicate(self):
     t = Vector()
     t.copyFrom([0, 1, 1, 3, 1, 3, 6], 0, 7)
     s = t.deduplicate()
     self.assertEqual(set(t[:]), {0, 1, 3, 6})
     self.assertEqual(s, 3)
Example #11
0
 def test_disordered(self):
     t = Vector()
     t.copyFrom([5, 4, 3, 2, 1], 0, 5)
     self.assertEqual(t.disordered(), 4)