Algorithms
Jump to navigation
Jump to search
Contents
Java Graph Implementation with Search Methods
Here is the first set
Java Graph Implementation with Search Methods
Here is the second set
Java Graph Implementation with Search Methods
Here is the third set
import java.util.HashMap; import java.util.LinkedList;
public class Chart {
static class Employee {
int id;
String firstName;
String lastName;
String jobTitle;
boolean mapped;
Employee(int id, String fn, String ln, String jt) {
this.id = id;
this.jobTitle = jt;
this.firstName = fn;
this.lastName = ln;
}
void map() {
mapped = true;
}
void unmap() {
mapped = false;
}
}
private final HashMap<Employee, LinkedList<Employee>> assignment;
public Chart(boolean directed) {
assignment = new HashMap<>();
}
public void addEdgeHelper(Employee a, Employee b) {
LinkedList<Employee> e = assignment.get(a);
if (e != null) {
assignment.remove(b);
} else
e = new LinkedList<>();
e.add(b);
assignment.put(a, e);
}
public void addEdge(Employee boss, Employee subordinate) {
if (!assignment.containsKey(boss))
assignment.put(boss, null);
if (!assignment.containsKey(subordinate))
assignment.put(subordinate, null);
addEdgeHelper(boss, subordinate);
}
public void depthFirstSearch(Employee employee) {
employee.map();
System.out.println(employee.firstName + " " + employee.lastName + " is a " + employee.jobTitle);
LinkedList<Employee> neighbors = assignment.get(employee);
if (neighbors == null)
return;
for (Employee e : neighbors) {
if (!e.mapped)
depthFirstSearch(e);
}
}
public void breadthFirstSearch(Employee employee) {
/*Check if target item is null - if so quit*/
if (employee == null)
return;
/*Declare a queue using LinkedList and add the target item*/
LinkedList<Employee> queue = new LinkedList<>();
queue.add(employee);
/*As long as the queue has data get the first in item .removeFirst*/
while (!queue.isEmpty()) {
Employee currentFirst = queue.removeFirst();
/*If visited move on*/
if (currentFirst.mapped) {
continue;
} else {
/*else visit it and print it*/
currentFirst.map();
System.out.println(currentFirst.id + ": " + currentFirst.firstName + " " + currentFirst.lastName + " - " + currentFirst.jobTitle);
}
/*Find neighbors of the current item*/
LinkedList<Employee> allNeighbors = assignment.get(currentFirst);
/*If there are none move on*/
if (allNeighbors == null)
continue;
/*else if there are some and not visited, add them to the queue and the process starts over*/
for (Employee e : allNeighbors) {
if (!e.mapped)
queue.add(e);
}
}
}
public void resetMapping() {
for (Employee e : assignment.keySet()) {
e.unmap();
}
}
public static void main(String args[]) {
Employee a = new Employee(38, "Jimbo", "Jones", "President");
Employee b = new Employee(39, "Mike", "McCobb", "VP");
Employee c = new Employee(43, "Elda", "Two", "VP");
Employee d = new Employee(48, "Simon", "Sneeth", "VP");
Employee e = new Employee(56, "Tim", "Scott", "Manager");
Employee f = new Employee(58, "Bob", "Tilman", "Manager");
Employee g = new Employee(78, "Andrew", "Cole", "Analyst");
Employee h = new Employee(83, "Matt", "Lemon", "Analyst");
Employee i = new Employee(88, "Chris", "Lock", "Analyst");
Employee j = new Employee(71, "Agnes", "White", "Accountant");
Employee k = new Employee(61, "George", "Mills", "Manager");
Employee l = new Employee(59, "Thomas", "Wells", "Manager");
Employee m = new Employee(63, "Zip", "Two", "Manager");
Employee n = new Employee(73, "Rasta", "Him", "Technician");
Employee o = new Employee(89, "Claire", "Collins", "Supervisor");
Employee p = new Employee(95, "Jim", "Four", "Receptionist");
Employee q = new Employee(104, "Tom", "Flat", "Receptionist");
Employee r = new Employee(64, "Grace", "Marks", "Manager");
Employee s = new Employee(68, "Dan", "Four", "Manager");
Employee t = new Employee(117, "Shad", "Fifty", "Security");
Employee u = new Employee(108, "Tall", "Nephew", "Legal");
Employee v = new Employee(109, "Short", "Nephew", "Legal");
Chart chart = new Chart(true);
chart.addEdge(a, b);
chart.addEdge(a, c);
chart.addEdge(a, d);
chart.addEdge(b, e);
chart.addEdge(b, f);
chart.addEdge(e, g);
chart.addEdge(e, h);
chart.addEdge(e, i);
chart.addEdge(f, j);
chart.addEdge(c, k);
chart.addEdge(c, l);
chart.addEdge(c, m);
chart.addEdge(l, n);
chart.addEdge(k, o);
chart.addEdge(o, p);
chart.addEdge(o, q);
chart.addEdge(d, r);
chart.addEdge(d, s);
chart.addEdge(s, t);
chart.addEdge(r, u);
chart.addEdge(r, v);
//System.out.println(a.firstName + " " + a.lastName + " " + a.jobTitle + " " + a.id);
chart.resetMapping();
//chart.depthFirstSearch(k);
chart.resetMapping();
chart.breadthFirstSearch(a);
}
}
MergeSort
public class MergeSort {
private static Comparable[] aux;
public static void sort(Comparable[] a) {
aux = new Comparable[a.length];
sort(a, 0, a.length - 1);
}
private static void merge(Comparable[] a, int lo, int mid, int hi) {
assert isSorted(a, lo, mid);
assert isSorted(a, mid + 1, hi);
//copy for [] a to [] aux
for (int k = lo; k <= hi; k++) {
aux[k] = a[k];
}
// the merging process
// i is the first index of the first half of the array
// j is the first index of the second half of the array
int i = lo, j = mid + 1;
// for every value of k - the indices of [] a
for (int k = lo; k <= hi; k++) {
/*Left half exhausted take from the right*/
if (i > mid)
a[k] = aux[j++];
/*Right half exhausted take from the left*/
else if (j > hi)
a[k] = aux[i++];
/*Current key on the right less than current key on the left take from the right*/
else if (less(aux[j], aux[i]))
a[k] = aux[j++];
/*Current key on the right greater than current key on the left take from the left */
else
a[k] = aux[i++];
}
assert isSorted(a, lo, hi);
}
private static void sort(Comparable[] a, int lo, int hi) {
if (hi <= lo)
return;
int mid = lo + (hi - lo) / 2;
sort(a, lo, mid);
sort(a, mid + 1, hi);
merge(a, lo, mid, hi);
}
private static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
private static boolean isSorted(Comparable[] a, int lo, int hi) {
for (int i = lo + 1; i <= hi; i++)
if (less(a[i], a[i - 1])) return false;
return true;
}
public static void show(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
//System.out.print(a[i]);
System.out.println(a[i]);
}
}
public static void main(String args[]) {
// Comparable[] a = {"E", "E", "G", "M", "R", "A", "C", "E", "R", "T"};
Comparable[] aa = {"A", "X", "G", "M", "R"};
Comparable[] bb = {"H", "D", "J", "Y", "Z"};
/*Merge the two comparable arrays*/
Comparable[] a = new Comparable[aa.length + bb.length];
System.arraycopy(aa, 0, a, 0, aa.length);
System.arraycopy(bb, 0, a, aa.length, bb.length);
MergeSort.sort(a);
show(a);
}
}