C++中全图的优化内存实现

问题描述

我需要实现 Watts-Strogatz 算法,但在创建完整图形时遇到了一些问题。我实现它的方式,它占用了太多内存,我需要在大型系统上工作,所以这是一个问题。

我正在为我的 n 个节点及其 n - 1 = k 个邻居创建一个称为格子的矩阵。例如。假设 n = 7。我的格子看起来像:

1 6 2 5 3 4 
2 0 3 6 4 5
3 1 4 0 5 6
4 2 5 1 6 0
5 3 6 2 0 1
6 4 0 3 1 2
0 5 1 4 2 3

现在是创建它的代码

这是 main.cpp:

#include "lattice.h"
#include <vector>

int main() {

    /*
     * initial parameters
     */
    int n = 7; //number of agents MUST BE ODD
    int k = 6; //number of agents with whom we wire; N - 1 for full graph
                   // NEEDS TO BE EVEN

    int** lattice = new int* [n];

    /*
     * creating ring lattice
     */
    for (int i = 0; i < n; i++) {
        lattice[i] = new int [k];
    }
    createRingLattice (n,k,lattice);

    delete[](lattice);

    std::cout << std::endl;
    return 0;
}

这是 createRingLattice 函数

void createRingLattice (int n,int k,int** lattice) {
    /*
     * setting up ring lattice
     */
    //table of the nearest neighbours
    //next iN prevIoUs iP
    int* iP = new int [n];
    int* iN = new int [n];
    for (int i = 0; i < n; i++) {
        iP[i] = i - 1;
        iN[i] = i + 1;
    }
    //boundary conditions
    iP[0] = n - 1;
    iN[n - 1] = 0;

    for (int i = 0; i < n; i++) {
        int countP = 0;
        int countN = 0;
        for (int j = 0; j < k; j++) {
            if (j % 2 == 0) {
                if (i + countN > n - 1) {
                    lattice[i][j] = iN[i + countN - n];
                } else {
                    lattice[i][j] = iN[i + countN];
                }
                countN++;
            }
            if (j % 2 == 1 ) {
                if (i - countP < 0) {
                    lattice[i][j] = iP[n + i - countP];
                } else {
                    lattice[i][j] = iP[i - countP];
                }
                countP++;
            }
        }
    }

    delete[](iN);
    delete[](iP);
}

一个问题: 有没有办法以更少的内存使用量来实现这一点?

第二个问题: 我见过有人使用邻接列表 (this one for example) 实现图形,但我想知道它是否比我的实现更优化?它也使用指针,而且我不是专家,所以我很难确定它在内存使用方面是否更好。

注意:我目前不关心速度。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)