// Created May 2007 import java.io.*; import java.util.*; public class DB { protected Item [] V; protected LinkedList E; protected int n; // Total number of items protected int m; // Total number of transactions protected int totalDegree; public DB(int size) { V = new Item[size]; for(int z=0; z!=size; z++) V[z] = new Item(z+1); E = new LinkedList(); n = size; m = 0; totalDegree=0; } // Quicksort private static int partition (int [] A, int p, int r) { int pivot = A[r]; int i = p-1; for ( int j = p ; j <= r-1 ; j++ ) if ( A[j] <= pivot ) { i++; int t = A[j]; A[j] = A[i]; A[i] = t; } int t = A[i+1]; A[i+1] = pivot; A[r] = t; return i+1; } private void qsort (int [] A, int p, int r) { if (p(); E.addFirst(e); n=1; m=1; totalDegree = 2; for ( int t = 1 ; t <= h ; t++ ) { // Select the size from a "folded" normal distribution x = (int) Math.ceil(Math.abs(sigma*src.nextGaussian()+mu)); if (x>0) { // Set e to the empty transaction e = new int [x]; if ( src.nextDouble() <= alpha ) { // NEW procedure // Expand V adding a new vertex v Item [] U = new Item [n+1]; for ( int i = 0 ; i < n ; i++ ) U[i] = new Item(V[i].getLabel(), V[i].getDegree()); U[n] = new Item(n+1,1); V = U; n++; // Add v to the new edge e[0] = n-1; // Then behave like in the OLD procedure w.r.t. the other vertices for ( int i = 0 ; i < x-1 ; i++ ) { // choose e[i] from 1..x with prob p_C(e[i],t) if (src.nextDouble() <= pn ) { // select by pref attachment // choose between 1 and \sum degrees. int choice = src.nextInt(totalDegree) + 1; // find the right vertex. int partial = 0; for ( int y = 0 ; y < n ; y++ ) { partial += getDegree(y); if ( choice <= partial ) { e[i] = y; break; } } // increment deg(v[choice]) V[e[i]].setDegree(V[e[i]].getDegree() + 1); } else { // select uniformly at random // choose between 0 and n-1 int choice = src.nextInt(n); e[i] = choice; // increment deg(v[choice]) V[e[i]].setDegree(V[e[i]].getDegree() + 1); } } } else { // OLD procedure for ( int i = 0 ; i < x ; i++ ) { // choose e[i] from 1..x with prob p_C(e[i],t) if ( src.nextDouble() <= po ) { // select by pref attachment // choose between 1 and \sum degrees. int choice = src.nextInt(totalDegree) + 1; // find the right vertex. int partial = 0; for ( int y = 0 ; y < n ; y++ ) { partial += getDegree(y); if ( choice <= partial ) { e[i] = y; break; } } // increment deg(v[choice]) V[e[i]].setDegree(V[e[i]].getDegree() + 1); } else { // select uniformly at random // choose between 0 and n-1 int choice = src.nextInt(n); e[i] = choice; // increment deg(v[choice]) V[e[i]].setDegree(V[e[i]].getDegree() + 1); } } } sort(e); E.addFirst(e); m++; totalDegree += x; } } } public int getDegree(int v) { if (v>=0&&vmax_degree) max_degree = degree[E.get(i)[j]]; // modify the degree sequence degree_sequence[degree[E.get(i)[j]]-1]--; degree_sequence[degree[E.get(i)[j]]]++; } int tot1 = 0; double tot2 = 0.0; for ( int i = 1 ; i <= max_degree ; i++ ) { if ( choice.equals("log-log-deg-dist") && degree_sequence[i]>0 ) System.out.println(Math.log(i) + " " + Math.log(degree_sequence[i])); else if (choice.equals("deg-dist")) System.out.println(i + " " + degree_sequence[i]); tot1 += (i*degree_sequence[i]); tot2 += (double) degree_sequence[i]/n; } } } }