GTGraph生成数据顺序但不连续的问题

本文介绍了使用GTGraph生成图数据时遇到的问题及其解决方案。针对生成的顶点ID不连续的情况,提出了两种解决方法:一是通过补充缺失顶点及其自旋边来确保连续性;二是采用分布式重编码算法进行处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GTGraph编译参考这篇文章: https://blog.youkuaiyun.com/robertchenguangzhi/article/details/40995249,需要将icc改为gcc 

./GTgraph-random -t 1 -n 1000 -m 10000 -o test.txt

RT,使用了一个图生成器GTGraph,但是发现其随机方法1生成的数据顺序但不连续,不利于使用如metis等划分软件(均要求顶点ID连续)。

p sp 100000 100000
a 1 25369 43
a 2 99456 48
a 3 37443 92
a 4 35745 70
a 5 60369 65
a 6 26032 87
a 7 69043 25
a 8 12628 0
a 8 51247 53
a 10 91163 5   //缺少9
a 11 42587 50

a 11 1158 44

a 71 88497 9  //在这呢

解决方法:1. 补充相关点和一条自旋边,即增加9    9 这样一条边,这样就能用于metis等软件划分了。

                方法1的代码:

package gtGraph;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;

public class GraphChecker {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		File test = new File("E:\\GTGraph\\sampleGraph_50m.txt") ;
		BufferedReader reader;
		
		try {
			reader = new BufferedReader(new FileReader(test));
			RandomAccessFile raf = new RandomAccessFile("E:\\GTGraph\\resultGraph_1.txt", "rw");  
			String tempString = null;
			long start = System.currentTimeMillis() ;
			Integer oldKey = -1 ;
			StringBuffer sb = null ;
			Integer indexCheck = 1 ; //用于检查编码连续性
			while ((tempString = reader.readLine()) != null)  
			{
				if (tempString != null && !"".equals(tempString)) {
					String[] keyValues = tempString.split(" ");
					if(!keyValues[0].equals("a")) 
						continue ;
					
					Integer key = Integer.parseInt(keyValues[1]);
					Integer value = Integer.parseInt(keyValues[2]);
					
					if(oldKey == -1) { //首行读取
						sb = new StringBuffer() ; 
						sb.append(key).append("\t").append(value) ;
						oldKey = key ;
						
						if(!indexCheck.equals(key)) {
							System.out.println("初始编码!=1");
							indexCheck = key ;
						}
						
						continue ;
					} else {
						if(!key.equals(oldKey)){  
							sb.append("\n") ;
							raf.write(sb.toString().getBytes()) ;
							oldKey = key ;
							
							while(!key.equals(new Integer(indexCheck + 1) )) { //补充不连续顶点及自旋边
								System.out.println("编码不连续!" + key);
								StringBuffer appStr = new StringBuffer().append(indexCheck+1).append("\t").append(indexCheck+1).append("\n") ;
								raf.write(appStr.toString().getBytes()); 	
								indexCheck++ ;
							}
							indexCheck++ ;
							
							sb = new StringBuffer() ;
							sb.append(key).append("\t").append(value) ;
						} else
							sb.append("\t").append(value) ;
					}
				}
			}
			raf.write(sb.toString().getBytes()) ;
		    raf.close() ;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (NumberFormatException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}catch (Exception e1) {
			e1.printStackTrace();
		}
	}
}

--------------------------------------------2018-7-6

 很不幸,第一种方法被证明是不对的,因为会出现空置点的情况,比如GtGraph号称生成10个点,但中间比如点5可能根本不存在,也没有目标点为点5的边。因此不适应metis划分,必须使用我之前自己设计的分布式重编码算法了。无语。。。。

--------------------------------------------2018-7-16

 2.使用我之前设计的分布式重编码算法。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值