diff --git a/data_structures/Graphs/bfs.java b/Data Structures/Graphs/BFS.java similarity index 100% rename from data_structures/Graphs/bfs.java rename to Data Structures/Graphs/BFS.java diff --git a/data_structures/Graphs/dfs.java b/Data Structures/Graphs/DFS.java similarity index 100% rename from data_structures/Graphs/dfs.java rename to Data Structures/Graphs/DFS.java diff --git a/data_structures/Graphs/Graphs.java b/Data Structures/Graphs/Graphs.java similarity index 100% rename from data_structures/Graphs/Graphs.java rename to Data Structures/Graphs/Graphs.java diff --git a/data_structures/HashMap/HashMap.java b/Data Structures/HashMap/HashMap.java similarity index 95% rename from data_structures/HashMap/HashMap.java rename to Data Structures/HashMap/HashMap.java index efb55c35..2c44a3e5 100644 --- a/data_structures/HashMap/HashMap.java +++ b/Data Structures/HashMap/HashMap.java @@ -1,141 +1,141 @@ - - -import java.util.ArrayList; -import java.util.LinkedList; - -public class HashMap { - public class hmnodes{ //HashMap nodes - K key; - V value; - } - - private int size=0; //size of hashmap - private LinkedList buckets[]; //array of addresses of list - - public HashMap(){ - buckets=new LinkedList[4]; //initially create bucket of any size - for(int i=0;i<4;i++) - buckets[i]=new LinkedList<>(); - } - - public void put(K key,V value) throws Exception{ - int bi=bucketIndex(key); //find the index,the new key will be inserted in linklist at that index - int fountAt=find(bi,key); //check if key already exists or not - if(fountAt==-1){ - hmnodes temp=new hmnodes(); //if doesn't exist create new node and insert - temp.key=key; - temp.value=value; - buckets[bi].addLast(temp); - this.size++; - }else{ - buckets[bi].get(fountAt).value=value;//if already exist modify the value - } - - double lambda = (this.size*1.0)/this.buckets.length; - if(lambda>2.0){ - rehash(); //rehashing function which will increase the size of bucket as soon as lambda exceeds 2.0 - } - - return; - } - - - public V get(K key) throws Exception{ - int bi=bucketIndex(key); - int fountAt=find(bi,key); - if(fountAt==-1){ - return null; - }else{ - return buckets[bi].get(fountAt).value; - } - } - - public V remove(K key) throws Exception{ - int bi=bucketIndex(key); - int fountAt=find(bi,key); - if(fountAt==-1){ - return null; - }else{ - this.size--; - return buckets[bi].remove(fountAt).value; - } - } - - public boolean containskey(K key) throws Exception{ - int bi=bucketIndex(key); - int fountAt=find(bi,key); - if(fountAt==-1){ - return false; - }else{ - return true; - } - } - - public int size(){ - return this.size; - } - - - public boolean isempty(){ - return this.size==0; - } - - public ArrayList keyset() throws Exception{ - ArrayList arr=new ArrayList<>(); - for(int i=0;i valueset() throws Exception{ - ArrayList arr=new ArrayList<>(); - for(int i=0;i"+temp.value+"]"); - } - System.out.println(); - } - } - - public int find(int bi,K key) throws Exception{ - for(int i=0;i ob[]= buckets; - buckets=new LinkedList[ob.length*2]; - for(int i=0;i(); - - size = 0; - for(int i=0;i { + public class hmnodes{ //HashMap nodes + K key; + V value; + } + + private int size=0; //size of hashmap + private LinkedList buckets[]; //array of addresses of list + + public HashMap(){ + buckets=new LinkedList[4]; //initially create bucket of any size + for(int i=0;i<4;i++) + buckets[i]=new LinkedList<>(); + } + + public void put(K key,V value) throws Exception{ + int bi=bucketIndex(key); //find the index,the new key will be inserted in linklist at that index + int fountAt=find(bi,key); //check if key already exists or not + if(fountAt==-1){ + hmnodes temp=new hmnodes(); //if doesn't exist create new node and insert + temp.key=key; + temp.value=value; + buckets[bi].addLast(temp); + this.size++; + }else{ + buckets[bi].get(fountAt).value=value;//if already exist modify the value + } + + double lambda = (this.size*1.0)/this.buckets.length; + if(lambda>2.0){ + rehash(); //rehashing function which will increase the size of bucket as soon as lambda exceeds 2.0 + } + + return; + } + + + public V get(K key) throws Exception{ + int bi=bucketIndex(key); + int fountAt=find(bi,key); + if(fountAt==-1){ + return null; + }else{ + return buckets[bi].get(fountAt).value; + } + } + + public V remove(K key) throws Exception{ + int bi=bucketIndex(key); + int fountAt=find(bi,key); + if(fountAt==-1){ + return null; + }else{ + this.size--; + return buckets[bi].remove(fountAt).value; + } + } + + public boolean containskey(K key) throws Exception{ + int bi=bucketIndex(key); + int fountAt=find(bi,key); + if(fountAt==-1){ + return false; + }else{ + return true; + } + } + + public int size(){ + return this.size; + } + + + public boolean isempty(){ + return this.size==0; + } + + public ArrayList keyset() throws Exception{ + ArrayList arr=new ArrayList<>(); + for(int i=0;i valueset() throws Exception{ + ArrayList arr=new ArrayList<>(); + for(int i=0;i"+temp.value+"]"); + } + System.out.println(); + } + } + + public int find(int bi,K key) throws Exception{ + for(int i=0;i ob[]= buckets; + buckets=new LinkedList[ob.length*2]; + for(int i=0;i(); + + size = 0; + for(int i=0;i child = new ArrayList<>(); - } - - private Node root; - private int size; - - /* - A generic tree is a tree which can have as many children as it can be - It might be possible that every node present is directly connected to - root node. - - In this code - Every function has two copies: one function is helper function which can be called from - main and from that function a private function is called which will do the actual work. - I have done this, while calling from main one have to give minimum parameters. - - */ - public treeclass() { //Constructor - Scanner scn = new Scanner(System.in); - root = create_treeG(null, 0, scn); - } - - private Node create_treeG(Node node, int childindx, Scanner scn) { - // display - if (node == null) { - System.out.println("Enter root's data"); - } else { - System.out.println("Enter data of parent of index " + node.data + " " + childindx); - } - // input - node = new Node(); - node.data = scn.nextInt(); - System.out.println("number of children"); - int number = scn.nextInt(); - for (int i = 0; i < number; i++) { - Node childd = create_treeG(node, i, scn); - size++; - node.child.add(childd); - } - return node; - } - - /* - Function to display the generic tree - */ - public void display() { //Helper function - display_1(root); - return; - } - - private void display_1(Node parent) { - System.out.print(parent.data + "=>"); - for (int i = 0; i < parent.child.size(); i++) { - System.out.print(parent.child.get(i).data + " "); - } - System.out.println("."); - for (int i = 0; i < parent.child.size(); i++) { - display_1(parent.child.get(i)); - } - return; - } - - /* - One call store the size directly but if you are asked compute size this function to calcuate - size goes as follows - */ - - public int size2call() { - return size2(root); - } - - public int size2(Node roott) { - int sz = 0; - for (int i = 0; i < roott.child.size(); i++) { - sz += size2(roott.child.get(i)); - } - return sz + 1; - } - - /* - Function to compute maximum value in the generic tree - */ - public int maxcall() { - int maxi = root.data; - return max(root, maxi); - } - - private int max(Node roott, int maxi) { - if (maxi < roott.data) - maxi = roott.data; - for (int i = 0; i < roott.child.size(); i++) { - maxi = max(roott.child.get(i), maxi); - } - - return maxi; - } - - /* - Function to compute HEIGHT of the generic tree - */ - - public int heightcall() { - return height(root) - 1; - } - - private int height(Node node) { - int h = 0; - for (int i = 0; i < node.child.size(); i++) { - int k = height(node.child.get(i)); - if (k > h) - h = k; - } - return h + 1; - } - - /* - Function to find whether a number is present in the generic tree or not - */ - - public boolean findcall(int info) { - return find(root, info); - } - - private boolean find(Node node, int info) { - if (node.data == info) - return true; - for (int i = 0; i < node.child.size(); i++) { - if (find(node.child.get(i), info)) - return true; - } - return false; - } - - /* - Function to calculate depth of generic tree - */ - public void depthcaller(int dep) { - depth(root, dep); - } - - public void depth(Node node, int dep) { - if (dep == 0) { - System.out.println(node.data); - return; - } - for (int i = 0; i < node.child.size(); i++) - depth(node.child.get(i), dep - 1); - return; - } - - /* - Function to print generic tree in pre-order - */ - public void preordercall() { - preorder(root); - System.out.println("."); - } - - private void preorder(Node node) { - System.out.print(node.data + " "); - for (int i = 0; i < node.child.size(); i++) - preorder(node.child.get(i)); - } - - /* - Function to print generic tree in post-order - */ - public void postordercall() { - postorder(root); - System.out.println("."); - } - - private void postorder(Node node) { - for (int i = 0; i < node.child.size(); i++) - postorder(node.child.get(i)); - System.out.print(node.data + " "); - } - - /* - Function to print generic tree in level-order - */ - - public void levelorder() { - LinkedList q = new LinkedList<>(); - q.addLast(root); - while (!q.isEmpty()) { - int k = q.getFirst().data; - System.out.print(k + " "); - - for (int i = 0; i < q.getFirst().child.size(); i++) { - q.addLast(q.getFirst().child.get(i)); - } - q.removeFirst(); - } - System.out.println("."); - } - - /* - Function to remove all leaves of generic tree - */ - public void removeleavescall() { - removeleaves(root); - } - - private void removeleaves(Node node) { - ArrayList arr = new ArrayList<>(); - for (int i = 0; i < node.child.size(); i++) { - if (node.child.get(i).child.size() == 0) { - arr.add(i); - // node.child.remove(i); - // i--; - } else - removeleaves(node.child.get(i)); - } - for (int i = arr.size() - 1; i >= 0; i--) { - node.child.remove(arr.get(i) + 0); - } - } - +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.Scanner; + +public class treeclass { + private class Node { + int data; + ArrayList child = new ArrayList<>(); + } + + private Node root; + private int size; + + /* + A generic tree is a tree which can have as many children as it can be + It might be possible that every node present is directly connected to + root node. + + In this code + Every function has two copies: one function is helper function which can be called from + main and from that function a private function is called which will do the actual work. + I have done this, while calling from main one have to give minimum parameters. + + */ + public treeclass() { //Constructor + Scanner scn = new Scanner(System.in); + root = create_treeG(null, 0, scn); + } + + private Node create_treeG(Node node, int childindx, Scanner scn) { + // display + if (node == null) { + System.out.println("Enter root's data"); + } else { + System.out.println("Enter data of parent of index " + node.data + " " + childindx); + } + // input + node = new Node(); + node.data = scn.nextInt(); + System.out.println("number of children"); + int number = scn.nextInt(); + for (int i = 0; i < number; i++) { + Node childd = create_treeG(node, i, scn); + size++; + node.child.add(childd); + } + return node; + } + + /* + Function to display the generic tree + */ + public void display() { //Helper function + display_1(root); + return; + } + + private void display_1(Node parent) { + System.out.print(parent.data + "=>"); + for (int i = 0; i < parent.child.size(); i++) { + System.out.print(parent.child.get(i).data + " "); + } + System.out.println("."); + for (int i = 0; i < parent.child.size(); i++) { + display_1(parent.child.get(i)); + } + return; + } + + /* + One call store the size directly but if you are asked compute size this function to calcuate + size goes as follows + */ + + public int size2call() { + return size2(root); + } + + public int size2(Node roott) { + int sz = 0; + for (int i = 0; i < roott.child.size(); i++) { + sz += size2(roott.child.get(i)); + } + return sz + 1; + } + + /* + Function to compute maximum value in the generic tree + */ + public int maxcall() { + int maxi = root.data; + return max(root, maxi); + } + + private int max(Node roott, int maxi) { + if (maxi < roott.data) + maxi = roott.data; + for (int i = 0; i < roott.child.size(); i++) { + maxi = max(roott.child.get(i), maxi); + } + + return maxi; + } + + /* + Function to compute HEIGHT of the generic tree + */ + + public int heightcall() { + return height(root) - 1; + } + + private int height(Node node) { + int h = 0; + for (int i = 0; i < node.child.size(); i++) { + int k = height(node.child.get(i)); + if (k > h) + h = k; + } + return h + 1; + } + + /* + Function to find whether a number is present in the generic tree or not + */ + + public boolean findcall(int info) { + return find(root, info); + } + + private boolean find(Node node, int info) { + if (node.data == info) + return true; + for (int i = 0; i < node.child.size(); i++) { + if (find(node.child.get(i), info)) + return true; + } + return false; + } + + /* + Function to calculate depth of generic tree + */ + public void depthcaller(int dep) { + depth(root, dep); + } + + public void depth(Node node, int dep) { + if (dep == 0) { + System.out.println(node.data); + return; + } + for (int i = 0; i < node.child.size(); i++) + depth(node.child.get(i), dep - 1); + return; + } + + /* + Function to print generic tree in pre-order + */ + public void preordercall() { + preorder(root); + System.out.println("."); + } + + private void preorder(Node node) { + System.out.print(node.data + " "); + for (int i = 0; i < node.child.size(); i++) + preorder(node.child.get(i)); + } + + /* + Function to print generic tree in post-order + */ + public void postordercall() { + postorder(root); + System.out.println("."); + } + + private void postorder(Node node) { + for (int i = 0; i < node.child.size(); i++) + postorder(node.child.get(i)); + System.out.print(node.data + " "); + } + + /* + Function to print generic tree in level-order + */ + + public void levelorder() { + LinkedList q = new LinkedList<>(); + q.addLast(root); + while (!q.isEmpty()) { + int k = q.getFirst().data; + System.out.print(k + " "); + + for (int i = 0; i < q.getFirst().child.size(); i++) { + q.addLast(q.getFirst().child.get(i)); + } + q.removeFirst(); + } + System.out.println("."); + } + + /* + Function to remove all leaves of generic tree + */ + public void removeleavescall() { + removeleaves(root); + } + + private void removeleaves(Node node) { + ArrayList arr = new ArrayList<>(); + for (int i = 0; i < node.child.size(); i++) { + if (node.child.get(i).child.size() == 0) { + arr.add(i); + // node.child.remove(i); + // i--; + } else + removeleaves(node.child.get(i)); + } + for (int i = arr.size() - 1; i >= 0; i--) { + node.child.remove(arr.get(i) + 0); + } + } + diff --git a/data_structures/Trees/TreeTraversal.java b/Data Structures/Trees/TreeTraversal.java similarity index 100% rename from data_structures/Trees/TreeTraversal.java rename to Data Structures/Trees/TreeTraversal.java diff --git a/Dynamic Programming/Levenshtein_distance.java b/Dynamic Programming/LevenshteinDistance.java similarity index 100% rename from Dynamic Programming/Levenshtein_distance.java rename to Dynamic Programming/LevenshteinDistance.java diff --git a/Dynamic Programming/rod_cutting.java b/Dynamic Programming/RodCutting.java similarity index 100% rename from Dynamic Programming/rod_cutting.java rename to Dynamic Programming/RodCutting.java diff --git a/Misc/ft.java b/Misc/FloydTriangle.java similarity index 100% rename from Misc/ft.java rename to Misc/FloydTriangle.java diff --git a/Huffman.java b/Misc/Huffman.java similarity index 96% rename from Huffman.java rename to Misc/Huffman.java index b93b7e7c..f3ab6c6b 100644 --- a/Huffman.java +++ b/Misc/Huffman.java @@ -1,158 +1,158 @@ - -import java.util.Comparator; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Scanner; -import java.util.Stack; -/** - * - * @author Mayank Kumar (mk9440) - */ -/* -Output : - -Enter number of distinct letters -6 -Enter letters with its frequncy to encode -Enter letter : a -Enter frequncy : 45 - -Enter letter : b -Enter frequncy : 13 - -Enter letter : c -Enter frequncy : 12 - -Enter letter : d -Enter frequncy : 16 - -Enter letter : e -Enter frequncy : 9 - -Enter letter : f -Enter frequncy : 5 - -Letter Encoded Form -a 0 -b 1 0 1 -c 1 0 0 -d 1 1 1 -e 1 1 0 1 -f 1 1 0 0 - -*/ - -class Node{ -String letr=""; -int freq=0,data=0; -Node left=null,right=null; -} - -//A comparator class to sort list on the basis of their frequency -class comp implements Comparator{ - @Override - public int compare(Node o1, Node o2) { - if(o1.freq>o2.freq){return 1;} - else if(o1.freq it=li.iterator(); - while(it.hasNext()){Node n=it.next();System.out.print(n.freq+" ");}System.out.println(); - } - - //Function for making tree (Huffman Tree) - public static Node make_huffmann_tree(List li){ - //Sorting list in increasing order of its letter frequency - li.sort(new comp()); - Node temp=null; - Iterator it=li.iterator(); - //System.out.println(li.size()); - //Loop for making huffman tree till only single node remains in list - while(true){ - temp=new Node(); - //a and b are Node which are to be combine to make its parent - Node a=new Node(),b=new Node(); - a=null;b=null; - //checking if list is eligible for combining or not - //here first assignment of it.next in a will always be true as list till end will - //must have atleast one node - a=(Node)it.next(); - //Below condition is to check either list has 2nd node or not to combine - //If this condition will be false, then it means construction of huffman tree is completed - if(it.hasNext()){b=(Node)it.next();} - //Combining first two smallest nodes in list to make its parent whose frequncy - //will be equals to sum of frequency of these two nodes - if(b!=null){ - temp.freq=a.freq+b.freq;a.data=0;b.data=1;//assigining 0 and 1 to left and right nodes - temp.left=a;temp.right=b; - //after combing, removing first two nodes in list which are already combined - li.remove(0);//removes first element which is now combined -step1 - li.remove(0);//removes 2nd element which comes on 1st position after deleting first in step1 - li.add(temp);//adding new combined node to list - //print_list(li); //For visualizing each combination step - } - //Sorting after combining to again repeat above on sorted frequency list - li.sort(new comp()); - it=li.iterator();//resetting list pointer to first node (head/root of tree) - if(li.size()==1){return (Node)it.next();} //base condition ,returning root of huffman tree - } -} - - //Function for finding path between root and given letter ch - public static void dfs(Node n,String ch){ - Stack st=new Stack(); // stack for storing path - int freq=n.freq; // recording root freq to avoid it adding in path encoding - find_path_and_encode(st,n,ch,freq); - } - - //A simple utility function to print stack (Used for printing path) - public static void print_path(Stack st){ - for(int i=0;i st,Node root,String s,int f){ - //Base condition - if(root!= null){ - if(root.freq!=f){st.push(root);} // avoiding root to add in path/encoding bits - if(root.letr.equals(s)){print_path(st);return;} // Recursion stopping condition when path gets founded - find_path_and_encode(st,root.left,s,f); - find_path_and_encode(st,root.right,s,f); - //Popping if path not found in right or left of this node,because we previously - //pushed this node in taking a mindset that it might be in path - st.pop(); - } - } - - public static void main(String args[]){ - List li=new LinkedList<>(); - Scanner in=new Scanner(System.in); - System.out.println("Enter number of distinct letters "); - int n=in.nextInt(); - String s[]=new String[n]; - System.out.print("Enter letters with its frequncy to encode\n"); - for(int i=0;i{ + @Override + public int compare(Node o1, Node o2) { + if(o1.freq>o2.freq){return 1;} + else if(o1.freq it=li.iterator(); + while(it.hasNext()){Node n=it.next();System.out.print(n.freq+" ");}System.out.println(); + } + + //Function for making tree (Huffman Tree) + public static Node make_huffmann_tree(List li){ + //Sorting list in increasing order of its letter frequency + li.sort(new comp()); + Node temp=null; + Iterator it=li.iterator(); + //System.out.println(li.size()); + //Loop for making huffman tree till only single node remains in list + while(true){ + temp=new Node(); + //a and b are Node which are to be combine to make its parent + Node a=new Node(),b=new Node(); + a=null;b=null; + //checking if list is eligible for combining or not + //here first assignment of it.next in a will always be true as list till end will + //must have atleast one node + a=(Node)it.next(); + //Below condition is to check either list has 2nd node or not to combine + //If this condition will be false, then it means construction of huffman tree is completed + if(it.hasNext()){b=(Node)it.next();} + //Combining first two smallest nodes in list to make its parent whose frequncy + //will be equals to sum of frequency of these two nodes + if(b!=null){ + temp.freq=a.freq+b.freq;a.data=0;b.data=1;//assigining 0 and 1 to left and right nodes + temp.left=a;temp.right=b; + //after combing, removing first two nodes in list which are already combined + li.remove(0);//removes first element which is now combined -step1 + li.remove(0);//removes 2nd element which comes on 1st position after deleting first in step1 + li.add(temp);//adding new combined node to list + //print_list(li); //For visualizing each combination step + } + //Sorting after combining to again repeat above on sorted frequency list + li.sort(new comp()); + it=li.iterator();//resetting list pointer to first node (head/root of tree) + if(li.size()==1){return (Node)it.next();} //base condition ,returning root of huffman tree + } +} + + //Function for finding path between root and given letter ch + public static void dfs(Node n,String ch){ + Stack st=new Stack(); // stack for storing path + int freq=n.freq; // recording root freq to avoid it adding in path encoding + find_path_and_encode(st,n,ch,freq); + } + + //A simple utility function to print stack (Used for printing path) + public static void print_path(Stack st){ + for(int i=0;i st,Node root,String s,int f){ + //Base condition + if(root!= null){ + if(root.freq!=f){st.push(root);} // avoiding root to add in path/encoding bits + if(root.letr.equals(s)){print_path(st);return;} // Recursion stopping condition when path gets founded + find_path_and_encode(st,root.left,s,f); + find_path_and_encode(st,root.right,s,f); + //Popping if path not found in right or left of this node,because we previously + //pushed this node in taking a mindset that it might be in path + st.pop(); + } + } + + public static void main(String args[]){ + List li=new LinkedList<>(); + Scanner in=new Scanner(System.in); + System.out.println("Enter number of distinct letters "); + int n=in.nextInt(); + String s[]=new String[n]; + System.out.print("Enter letters with its frequncy to encode\n"); + for(int i=0;i