From 79b85c3d4f3d01ea8e0eb8f41652a554974b1cf1 Mon Sep 17 00:00:00 2001 From: KavishanSukumar Date: Wed, 20 Oct 2021 16:54:26 +0530 Subject: [PATCH 1/7] Adding Boyer-MooreHorspool Algorithm for string matching in python language --- .../Boyer-MooreHorspoolAlgorithm.py | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 String Algorithms/String Matching/Boyer-MooreHorspoolAlgorithm.py diff --git a/String Algorithms/String Matching/Boyer-MooreHorspoolAlgorithm.py b/String Algorithms/String Matching/Boyer-MooreHorspoolAlgorithm.py new file mode 100644 index 0000000..54b9913 --- /dev/null +++ b/String Algorithms/String Matching/Boyer-MooreHorspoolAlgorithm.py @@ -0,0 +1,48 @@ +import os + +CHAR=256 + +def badCharacterTable(pattern): + length=len(pattern) + badchar=[length]*CHAR + + for i in range(length-1): + badchar[ord(pattern[i])]=length-i + + return badchar + +def stringSearch(text,pattern): + textlen=len(text) + patternlen=len(pattern) + badchar=badCharacterTable(pattern) + occurance=[] + position=0 + if(text=="" or pattern==""): + print("Text:"+text+"\nPattern:"+pattern+"\nTotal Number matched:"+str(len(occurance))+"\nPositions matched:"+', '.join(occurance)) + return + + while(position<=(textlen-patternlen)): + j=patternlen-1 + while(j>=0 and (text[position+j]==pattern[j] or pattern[j]=='_')): + j=j-1 + + if(j==-1): + occurance.append(str(position+1)) + position=position+1 + else: + position=position+ max(1,j-badchar[ord(text[position+j])]) + print("Text:"+text+"\nPattern:"+pattern+"\nTotal Number matched:"+str(len(occurance))+"\nPositions matched:"+', '.join(occurance)) + +def main(): + while (1): + text=input("Enter a sample text:") + pattern=input("Enter a pattern:") + stringSearch(text,pattern) + print("\nEnter 1 to test Continue\nEnter 0 to EXIT") + n=input("Enter your choise: ") + if(n=='0'): + return + + +if __name__=="__main__": + main() From cdaee5bda6742c8b6051271964a038fd627889e1 Mon Sep 17 00:00:00 2001 From: KavishanSukumar Date: Wed, 20 Oct 2021 17:31:08 +0530 Subject: [PATCH 2/7] Adding undirected graph using Cpp langague --- .../UndirectedGraphMatrix.cpp | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 Data Structures/Graph/Undirected Graph/UndirectedGraphMatrix.cpp diff --git a/Data Structures/Graph/Undirected Graph/UndirectedGraphMatrix.cpp b/Data Structures/Graph/Undirected Graph/UndirectedGraphMatrix.cpp new file mode 100644 index 0000000..4849aaf --- /dev/null +++ b/Data Structures/Graph/Undirected Graph/UndirectedGraphMatrix.cpp @@ -0,0 +1,36 @@ +#include +using namespace std; +#define Max 10 +int graph[Max][Max]; +void addEdge(int u,int v){ + graph[u][v]=1; + graph[v][u]=1; +} + +void prints(){ + cout<<" "; + for(int j=1;j Date: Wed, 20 Oct 2021 17:35:11 +0530 Subject: [PATCH 3/7] Adding undirected graph using adjacency list --- .../UndirectedGraphAdjacenyList.cpp | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 Data Structures/Graph/Undirected Graph/UndirectedGraphAdjacenyList.cpp diff --git a/Data Structures/Graph/Undirected Graph/UndirectedGraphAdjacenyList.cpp b/Data Structures/Graph/Undirected Graph/UndirectedGraphAdjacenyList.cpp new file mode 100644 index 0000000..09a302a --- /dev/null +++ b/Data Structures/Graph/Undirected Graph/UndirectedGraphAdjacenyList.cpp @@ -0,0 +1,31 @@ +#include +#include +#include +#include +#define Max 10 +using namespace std; +list g[Max]; +void addEdge(int u,int v){ + g[u].push_back(v); + g[v].push_back(u); + +} + +void print(){ + list::iterator ptr; + for(int i=1;i"; + for(ptr=g[i].begin();ptr!=g[i].end();ptr++){ + cout<<*ptr<<" "; + } + cout< Date: Wed, 20 Oct 2021 17:43:51 +0530 Subject: [PATCH 4/7] Adding Is cyclic algorithm for a adjacency matrix --- Graph Algorithms/AdjaceneyListIsCyclic.cpp | 96 ++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 Graph Algorithms/AdjaceneyListIsCyclic.cpp diff --git a/Graph Algorithms/AdjaceneyListIsCyclic.cpp b/Graph Algorithms/AdjaceneyListIsCyclic.cpp new file mode 100644 index 0000000..a201c4b --- /dev/null +++ b/Graph Algorithms/AdjaceneyListIsCyclic.cpp @@ -0,0 +1,96 @@ +#include +#include +#include +#include +#include +#define Max 10 +using namespace std; + +class Graph{ + list adjlist[Max]; + + public: + void addEdge(int u,int v){ + adjlist[u].push_back(v); + //if undirected + //adjlist[v].push_back(u); + } + void printGraph(){ + list::iterator it; + + for(int i=0;i"; + for(it=adjlist[i].begin();it!=adjlist[i].end();++it){ + cout<<*it<<"-"; + } + cout<<"/\n"; + } + cout<<"\n\n"; + } + + + private: + bool isCyclicUtil(int v, bool visited[], bool recStack[]){ + if(visited[v] == false) + { + + visited[v] = true; + recStack[v] = true; + + + list::iterator it; + for(it = adjlist[v].begin(); it != adjlist[v].end(); ++it) + { + if ( !visited[*it] && isCyclicUtil(*it, visited, recStack) ) + return true; + else if (recStack[*it]) + return true; + } + + } + recStack[v] = false; + return false; + } + + public: + bool isCyclic(){ + bool visited[Max]; + bool recStack[Max]; + for(int i = 0; i < Max; i++){ + visited[i] = false; + recStack[i] = false; + } + + for(int i = 0; i < Max; i++) + if (isCyclicUtil(i, visited, recStack)) + return true; + + return false; + } + +}; + +int main(){ + Graph g; + g.addEdge(1,2); + g.addEdge(3,1); + g.addEdge(2,3); + g.addEdge(3,4); + g.addEdge(4,5); + g.addEdge(5,6); + g.addEdge(6,7); + g.addEdge(7,8); + g.addEdge(7,9); + + g.printGraph(); + + + if(g.isCyclic()){ + cout<<"Graph is cyclic"< Date: Wed, 20 Oct 2021 17:48:25 +0530 Subject: [PATCH 5/7] adding AdjacencyList Indegree Out degree Algorithms --- .../AdjacencyList_Indegree_out degree.cpp | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 Graph Algorithms/AdjacencyList_Indegree_out degree.cpp diff --git a/Graph Algorithms/AdjacencyList_Indegree_out degree.cpp b/Graph Algorithms/AdjacencyList_Indegree_out degree.cpp new file mode 100644 index 0000000..1d5af68 --- /dev/null +++ b/Graph Algorithms/AdjacencyList_Indegree_out degree.cpp @@ -0,0 +1,77 @@ +#include +#include +#include +#include +#include +#define Max 10 +using namespace std; + +class Graph{ + list adjlist[Max]; + + public: + void addEdge(int u,int v){ + adjlist[u].push_back(v); + } + void printGraph(){ + list::iterator it; + + for(int i=0;i"; + for(it=adjlist[i].begin();it!=adjlist[i].end();++it){ + cout<<*it<<"-"; + } + cout<<"/\n"; + } + cout<<"\n\n"; + } + + void outDegree(){ + list::iterator it; + int outdegree[Max]={0}; + for(int i=0;i::iterator it; + int indegree[Max]={0}; + for(int i=0;i Date: Wed, 20 Oct 2021 17:53:07 +0530 Subject: [PATCH 6/7] Adding algorithm to find out weather its Bipartite --- .../adjacencyList_IsBipartite.cpp | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 Graph Algorithms/adjacencyList_IsBipartite.cpp diff --git a/Graph Algorithms/adjacencyList_IsBipartite.cpp b/Graph Algorithms/adjacencyList_IsBipartite.cpp new file mode 100644 index 0000000..41daca7 --- /dev/null +++ b/Graph Algorithms/adjacencyList_IsBipartite.cpp @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include +#define Max 10 +using namespace std; + +class Graph{ + list adjlist[Max]; + + public: + void addEdge(int u,int v){ + adjlist[u].push_back(v); + } + void printGraph(){ + list::iterator it; + + for(int i=0;i"; + for(it=adjlist[i].begin();it!=adjlist[i].end();++it){ + cout<<*it<<"-"; + } + cout<<"/\n"; + } + cout<<"\n\n"; + } + + void isbipartite(){ + bool visited[Max]={false}; + int partition[Max]={0}; + int distance[Max]={0}; + queue q; + list::iterator it; + int check=1; + + visited[1]=true; + partition[1]=1; + distance[1]=0; + q.push(1); + while(!q.empty()){ + int u=q.front(); + for(it=adjlist[u].begin();it!=adjlist[u].end();++it){ + if(partition[u]==partition[*it]){ + check=0; + }else{ + if(visited[*it]==false){ + visited[*it]=true; + distance[*it]=distance[u]+1; + partition[*it]=3-partition[u]; + q.push(*it); + } + } + } + q.pop(); + } + if(check){ + cout<<"This is a bipartite graph"< Date: Wed, 20 Oct 2021 17:56:28 +0530 Subject: [PATCH 7/7] adding algorithm to find out weather a node is IsReachable --- .../AdjacencyList_IsReachable.cpp | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 Graph Algorithms/AdjacencyList_IsReachable.cpp diff --git a/Graph Algorithms/AdjacencyList_IsReachable.cpp b/Graph Algorithms/AdjacencyList_IsReachable.cpp new file mode 100644 index 0000000..6de17a8 --- /dev/null +++ b/Graph Algorithms/AdjacencyList_IsReachable.cpp @@ -0,0 +1,82 @@ +#include +#include +#include +#include +#include +#define Max 10 +using namespace std; + +class Graph{ + list adjlist[Max]; + + public: + void addEdge(int u,int v){ + adjlist[u].push_back(v); + //if undirected + //adjlist[v].push_back(u); + } + void printGraph(){ + list::iterator it; + + for(int i=0;i"; + for(it=adjlist[i].begin();it!=adjlist[i].end();++it){ + cout<<*it<<"-"; + } + cout<<"/\n"; + } + cout<<"\n\n"; + } + + void isreachable(int u,int v){ + bool visited[Max]={false}; + list::iterator it; + int check=0; + queue q; + visited[u]=true; + q.push(u); + while(!q.empty()){ + int d=q.front(); + q.pop(); + if(d==v){ + check=1; + } + for(it=adjlist[d].begin();it!=adjlist[d].end();++it){ + if(visited[*it]==false){ + visited[*it]=true; + q.push(*it); + } + } + + } + if(check){ + cout<<"The edge "<