簡體   English   中英

如何在C中用百萬個頂點表示圖?

[英]How to represent graph with million vertices in C?

我有大小為1000x1000的圖形,所以有一百萬個頂點。 從每個頂點我都可以向下或向右走,因此幾乎每個頂點都有兩個邊,每個頂點都有一個數。

我必須在該圖中找到最大的路徑,但是我不知道如何表示它。 我嘗試過矩陣,但是我想它太大了,因為如果我有int array[1000][1000] ,我的程序將停止工作。 在Pascal中,我看到了數組[1..1000][1..1000] ,但是在C中,它不起作用。

編輯:謝謝,我忘了在所有數組上使用動態分配。 那解決了問題。 :)

EDIT2:現在還有另一個問題:/當我使用100x100頂點時,我的程序正在運行,但是當我使用1000x1000頂點時,while程序將掉下來。 這是代碼的選定部分,不起作用。 嘗試改變n = 1000; m = 1000; 到n = 100; m = 100; 並且程序將持續到最后。

#include<stdio.h>
#include<stdint.h>
int main()
{
  int64_t i,j,n,m,cukriky = 0,q = 0;
  n = 1000;
  m = 1000;
  int (*hall)[m],(*matrix)[m*n],(*d)[m*n];
  hall = (int (*)[m])malloc(n * m * sizeof(int));
  matrix = (int (*)[m*n])malloc(n*m * n*m * sizeof(int));
  d = (int (*)[m*n])malloc(n*m * n*m * sizeof(int));
  //while((c = getchar())!= '\n');
  for(i = 0; i < n; i++){
       for(j = 0; j < m; j++){
            hall[i][j] = -i;}
  }
  /*for(i = 0; i < n*m; i++){
       for(j = 0; j < n*m; j++)
            matica[i][j] = 0;
  }*/
  matrix[0][1] = hall[0][0]+hall[0][1];
  matrix[0][m] = hall[0][0]+hall[1][0];
  for(i = 2; i < m*n; i++){
       if(i % m != 0){
          matrix[i-1][i] = hall[q][i%m];
          printf("A %lld %lld matrix[%lld][%lld],hall[%lld][%lld], %d   %d\n",i,m,i-1,i,q,i%m, matrix[i-1][i],hall[q][i%m]);
       }
       if(i+m-1 < m*n){
         matrix[i-1][i+m-1] = hall[q+1][(i-1)%m];
         printf("B %lld %lld matrix[%lld][%lld],hall[%lld][%lld], %d   %d\n",i,m,i-1,i+m-1,q+1,(i-1)%m, matrix[i-1][i+m-1],hall[q+1][(i-1)%m]);
       }
       if(i % (m) == 0)
          q++;
  }
 printf("A");


}

似乎不存在矩陣[347] 0。

如果圖形中的大多數整數均為零,則可以使用稀疏矩陣表示圖形。

在數值分析中,稀疏矩陣是其中大多數元素為零的矩陣。 相反,如果大多數元素都不為零,則矩陣被認為是密集的。 零元素占矩陣元素總數的比例稱為稀疏度(密度)。

在這里閱讀更多

您應該使用一個鄰接表 ,其中僅存儲每個節點的鄰居。 由於您的圖是稀疏的,因此鄰接表將比完整的鄰接矩陣占用更少的內存。

根據您要處理的問題的結構,您甚至可以提出一個更“聰明”的編碼(感謝@M Oehm的評論)。 但是,了解各種表示圖的方法是一個好主意。 鄰接矩陣僅適用於密集圖。 否則,請使用其他編碼,以節省空間。

我嘗試過矩陣,但是我想它太大了,因為我的程序將停止工作

您應該始終使用malloc動態分配大量數據。

所有台式機操作系統的工作方式都是這樣的:每個進程(您的程序)都具有一定數量的靜態內存( .data.bss )和堆棧( .stack )。 靜態數據是全局變量/靜態變量所在的位置。 堆棧是所有本地(自動)變量所在的位置。

靜態內存和堆棧都相對較小,我們談論的是千字節而不是兆字節。 如果您分配太多的靜態變量或太多的自動變量,您的進程將用光內存。

因此,所有大塊內存(如矩陣)都需要在堆上分配,這是通過動態分配來完成的。 不一定是因為您在運行時不知道矩陣的大小,而是因為在堆上分配的內存沒有大小限制,並且在計算機上的所有進程之間共享。 上限是操作系統或計算機的物理RAM。

(它在Pascal中工作的原因可能是因為您正在使用Object Pascal / Delphi,它可能會為您分配堆上的數據。例如,由於上述原因,整個Delphi VCL庫僅使用動態分配。)

如果您擁有具有多個內核的GPU,則即使在復雜性更高的情況下也可以正常工作。請參閱Nvidia CUDA C編程指南,並閱讀有關LAPCK和BLAZE-LIB的信息,以更好地處理頂點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM