Files
uni/third/semester1/CT3532: Database Systems II/assignments/assignment3/latex/_minted-CT3532-Assignment-3/DF1AF5AE1379C0C70813F6D2107054B9150289935945A39E28529C7C184470CD.pygtex
2023-12-07 01:44:01 +00:00

105 lines
12 KiB
Plaintext

\begin{Verbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8\relax}]
\PYG{c+c1}{// Input: A snapshot Graph object}
\PYG{c+c1}{// Output: The a Set of Player objects that are on the most paths}
\PYG{k+kd}{public}\PYG{+w}{ }\PYG{n}{Set}\PYG{o}{\PYGZlt{}}\PYG{n}{Player}\PYG{o}{\PYGZgt{}}\PYG{+w}{ }\PYG{n+nf}{getMostInfluentialNode}\PYG{p}{(}\PYG{n}{Graph}\PYG{+w}{ }\PYG{n}{graph}\PYG{p}{)}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
\PYG{+w}{ }\PYG{n}{HashMap}\PYG{o}{\PYGZlt{}}\PYG{n}{Player}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{Integer}\PYG{o}{\PYGZgt{}}\PYG{+w}{ }\PYG{n}{counts}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{k}{new}\PYG{+w}{ }\PYG{n}{HashMap}\PYG{o}{\PYGZlt{}\PYGZgt{}}\PYG{p}{();}
\PYG{+w}{ }\PYG{c+c1}{// an ArrayList to hold the Sets of paths generated}
\PYG{+w}{ }\PYG{n}{ArrayList}\PYG{o}{\PYGZlt{}}\PYG{n}{Set}\PYG{o}{\PYGZlt{}}\PYG{n}{ArrayList}\PYG{o}{\PYGZlt{}}\PYG{n}{Player}\PYG{o}{\PYGZgt{}\PYGZgt{}\PYGZgt{}}\PYG{+w}{ }\PYG{n}{setsOfPaths}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{k}{new}\PYG{+w}{ }\PYG{n}{ArrayList}\PYG{o}{\PYGZlt{}\PYGZgt{}}\PYG{p}{();}
\PYG{+w}{ }\PYG{c+c1}{// get a set of all the nodes in the graph}
\PYG{+w}{ }\PYG{n}{Set}\PYG{o}{\PYGZlt{}}\PYG{n}{Player}\PYG{o}{\PYGZgt{}}\PYG{+w}{ }\PYG{n}{nodes}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{k}{new}\PYG{+w}{ }\PYG{n}{HashSet}\PYG{o}{\PYGZlt{}\PYGZgt{}}\PYG{p}{();}
\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{p}{(}\PYG{n}{Edge}\PYG{+w}{ }\PYG{n}{edge}\PYG{+w}{ }\PYG{p}{:}\PYG{+w}{ }\PYG{n}{graph}\PYG{p}{.}\PYG{n+na}{edges}\PYG{p}{)}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{p}{(}\PYG{n}{Player}\PYG{+w}{ }\PYG{n}{player}\PYG{+w}{ }\PYG{p}{:}\PYG{+w}{ }\PYG{n}{edge}\PYG{p}{.}\PYG{n+na}{nodes}\PYG{p}{)}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
\PYG{+w}{ }\PYG{n}{nodes}\PYG{p}{.}\PYG{n+na}{add}\PYG{p}{(}\PYG{n}{player}\PYG{p}{);}
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
\PYG{+w}{ }\PYG{c+c1}{// generate the "paths" of length 1}
\PYG{+w}{ }\PYG{n}{Set}\PYG{o}{\PYGZlt{}}\PYG{n}{ArrayList}\PYG{o}{\PYGZlt{}}\PYG{n}{Player}\PYG{o}{\PYGZgt{}\PYGZgt{}}\PYG{+w}{ }\PYG{n}{oneNodePaths}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{k}{new}\PYG{+w}{ }\PYG{n}{HashSet}\PYG{o}{\PYGZlt{}\PYGZgt{}}\PYG{p}{();}
\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{p}{(}\PYG{n}{Player}\PYG{+w}{ }\PYG{n}{player}\PYG{+w}{ }\PYG{p}{:}\PYG{+w}{ }\PYG{n}{nodes}\PYG{p}{)}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
\PYG{+w}{ }\PYG{n}{ArrayList}\PYG{o}{\PYGZlt{}}\PYG{n}{Player}\PYG{o}{\PYGZgt{}}\PYG{+w}{ }\PYG{n}{path}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{k}{new}\PYG{+w}{ }\PYG{n}{ArrayList}\PYG{o}{\PYGZlt{}\PYGZgt{}}\PYG{p}{();}
\PYG{+w}{ }\PYG{n}{path}\PYG{p}{.}\PYG{n+na}{add}\PYG{p}{(}\PYG{n}{player}\PYG{p}{);}
\PYG{+w}{ }\PYG{n}{oneNodePaths}\PYG{p}{.}\PYG{n+na}{add}\PYG{p}{(}\PYG{n}{path}\PYG{p}{);}
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
\PYG{+w}{ }\PYG{c+c1}{// loop from i = 2 to i = N building up paths of length i}
\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{p}{(}\PYG{k+kt}{int}\PYG{+w}{ }\PYG{n}{i}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{l+m+mi}{2}\PYG{p}{;}\PYG{+w}{ }\PYG{n}{i}\PYG{+w}{ }\PYG{o}{\PYGZlt{}=}\PYG{+w}{ }\PYG{n}{oneNodePaths}\PYG{p}{.}\PYG{n+na}{size}\PYG{p}{();}\PYG{+w}{ }\PYG{n}{i}\PYG{o}{+=}\PYG{p}{)}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
\PYG{+w}{ }\PYG{c+c1}{// get the Set of paths of length i-1}
\PYG{+w}{ }\PYG{n}{Set}\PYG{o}{\PYGZlt{}}\PYG{n}{ArrayList}\PYG{o}{\PYGZlt{}}\PYG{n}{Player}\PYG{o}{\PYGZgt{}\PYGZgt{}}\PYG{+w}{ }\PYG{n}{iMinusOneLengthPaths}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n}{setsOfPaths}\PYG{p}{.}\PYG{n+na}{get}\PYG{p}{(}\PYG{n}{i}\PYG{o}{\PYGZhy{}}\PYG{l+m+mi}{1}\PYG{p}{);}
\PYG{+w}{ }\PYG{c+c1}{// create the Set of paths of length i}
\PYG{+w}{ }\PYG{n}{Set}\PYG{o}{\PYGZlt{}}\PYG{n}{ArrayList}\PYG{o}{\PYGZlt{}}\PYG{n}{Player}\PYG{o}{\PYGZgt{}\PYGZgt{}}\PYG{+w}{ }\PYG{n}{iLengthPaths}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{k}{new}\PYG{+w}{ }\PYG{n}{HashSet}\PYG{o}{\PYGZlt{}\PYGZgt{}}\PYG{p}{();}
\PYG{+w}{ }\PYG{c+c1}{// loop over each path of length i-1}
\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{p}{(}\PYG{n}{ArrayList}\PYG{o}{\PYGZlt{}}\PYG{n}{Player}\PYG{o}{\PYGZgt{}}\PYG{+w}{ }\PYG{n}{path}\PYG{+w}{ }\PYG{p}{:}\PYG{+w}{ }\PYG{n}{iMinusOneLengthPaths}\PYG{p}{)}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
\PYG{+w}{ }\PYG{c+c1}{// loop over each edge in the graph}
\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{p}{(}\PYG{n}{Edge}\PYG{+w}{ }\PYG{n}{edge}\PYG{+w}{ }\PYG{p}{:}\PYG{+w}{ }\PYG{n}{graph}\PYG{p}{.}\PYG{n+na}{edges}\PYG{p}{)}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
\PYG{+w}{ }\PYG{c+c1}{// check if the last node of the path is in the Edge}
\PYG{+w}{ }\PYG{n}{Player}\PYG{+w}{ }\PYG{n}{lastNode}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n}{path}\PYG{p}{.}\PYG{n+na}{get}\PYG{p}{(}\PYG{n}{path}\PYG{p}{.}\PYG{n+na}{size}\PYG{p}{()}\PYG{o}{\PYGZhy{}}\PYG{l+m+mi}{1}\PYG{p}{);}
\PYG{+w}{ }\PYG{c+c1}{// convert Set to Array so we can refer to the nodes by indices}
\PYG{+w}{ }\PYG{c+c1}{// assuming here that each edge contains only two nodes -- more robust code would check for this}
\PYG{+w}{ }\PYG{n}{Player}\PYG{o}{[]}\PYG{+w}{ }\PYG{n}{players}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n}{edge}\PYG{p}{.}\PYG{n+na}{nodes}\PYG{p}{.}\PYG{n+na}{toArray}\PYG{p}{(}\PYG{k}{new}\PYG{+w}{ }\PYG{n}{Player}\PYG{o}{[}\PYG{l+m+mi}{2}\PYG{o}{]}\PYG{p}{);}
\PYG{+w}{ }\PYG{c+c1}{// the code repetition here is not ideal, but it allows everything to be kept in one single method for readability}
\PYG{+w}{ }\PYG{c+c1}{// if the 0th node of players is the same as lastNode, the 1st node of players can be appended}
\PYG{+w}{ }\PYG{k}{if}\PYG{+w}{ }\PYG{p}{(}\PYG{n}{lastNode}\PYG{p}{.}\PYG{n+na}{equals}\PYG{p}{(}\PYG{n}{players}\PYG{o}{[}\PYG{l+m+mi}{0}\PYG{o}{]}\PYG{p}{))}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
\PYG{+w}{ }\PYG{c+c1}{// if players[1] is not already in the path}
\PYG{+w}{ }\PYG{k}{if}\PYG{+w}{ }\PYG{p}{(}\PYG{o}{!}\PYG{n}{path}\PYG{p}{.}\PYG{n+na}{contains}\PYG{p}{(}\PYG{n}{players}\PYG{o}{[}\PYG{l+m+mi}{1}\PYG{o}{]}\PYG{p}{))}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
\PYG{+w}{ }\PYG{c+c1}{// create new ArrayList to represent the path}
\PYG{+w}{ }\PYG{n}{ArrayList}\PYG{o}{\PYGZlt{}}\PYG{n}{Player}\PYG{o}{\PYGZgt{}}\PYG{+w}{ }\PYG{n}{newPath}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{k}{new}\PYG{+w}{ }\PYG{n}{ArrayList}\PYG{o}{\PYGZlt{}\PYGZgt{}}\PYG{p}{(}\PYG{n}{path}\PYG{p}{);}
\PYG{+w}{ }\PYG{n}{newPath}\PYG{p}{.}\PYG{n+na}{append}\PYG{p}{(}\PYG{n}{players}\PYG{o}{[}\PYG{l+m+mi}{1}\PYG{o}{]}\PYG{p}{);}
\PYG{+w}{ }\PYG{c+c1}{// increment the count for players[1]}
\PYG{+w}{ }\PYG{k}{if}\PYG{+w}{ }\PYG{p}{(}\PYG{n}{counts}\PYG{p}{.}\PYG{n+na}{containsKey}\PYG{p}{(}\PYG{n}{players}\PYG{o}{[}\PYG{l+m+mi}{1}\PYG{o}{]}\PYG{p}{))}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
\PYG{+w}{ }\PYG{k+kt}{int}\PYG{+w}{ }\PYG{n}{newCount}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n}{counts}\PYG{p}{.}\PYG{n+na}{get}\PYG{p}{(}\PYG{n}{players}\PYG{o}{[}\PYG{l+m+mi}{1}\PYG{o}{]}\PYG{p}{)}\PYG{o}{++}\PYG{p}{;}
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
\PYG{+w}{ }\PYG{k}{else}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
\PYG{+w}{ }\PYG{k+kt}{int}\PYG{+w}{ }\PYG{n}{newCount}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{l+m+mi}{1}\PYG{p}{;}
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
\PYG{+w}{ }\PYG{n}{counts}\PYG{p}{.}\PYG{n+na}{put}\PYG{p}{(}\PYG{n}{players}\PYG{o}{[}\PYG{l+m+mi}{1}\PYG{o}{]}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{newCount}\PYG{p}{);}
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
\PYG{+w}{ }\PYG{c+c1}{// else if the 1st node of players is the same as lastNode, the 0th node of players can be appended}
\PYG{+w}{ }\PYG{k}{else}\PYG{+w}{ }\PYG{k}{if}\PYG{+w}{ }\PYG{p}{(}\PYG{n}{lastNode}\PYG{p}{.}\PYG{n+na}{equals}\PYG{p}{(}\PYG{n}{players}\PYG{o}{[}\PYG{l+m+mi}{1}\PYG{o}{]}\PYG{p}{))}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
\PYG{+w}{ }\PYG{c+c1}{// if players[0] is not already in the path}
\PYG{+w}{ }\PYG{k}{if}\PYG{+w}{ }\PYG{p}{(}\PYG{o}{!}\PYG{n}{path}\PYG{p}{.}\PYG{n+na}{contains}\PYG{p}{(}\PYG{n}{players}\PYG{o}{[}\PYG{l+m+mi}{0}\PYG{o}{]}\PYG{p}{))}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
\PYG{+w}{ }\PYG{c+c1}{// create new ArrayList to represent the path}
\PYG{+w}{ }\PYG{n}{ArrayList}\PYG{o}{\PYGZlt{}}\PYG{n}{Player}\PYG{o}{\PYGZgt{}}\PYG{+w}{ }\PYG{n}{newPath}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{k}{new}\PYG{+w}{ }\PYG{n}{ArrayList}\PYG{o}{\PYGZlt{}\PYGZgt{}}\PYG{p}{(}\PYG{n}{path}\PYG{p}{);}
\PYG{+w}{ }\PYG{n}{newPath}\PYG{p}{.}\PYG{n+na}{append}\PYG{p}{(}\PYG{n}{players}\PYG{o}{[}\PYG{l+m+mi}{0}\PYG{o}{]}\PYG{p}{);}
\PYG{+w}{ }\PYG{c+c1}{// increment the count for players[0]}
\PYG{+w}{ }\PYG{k}{if}\PYG{+w}{ }\PYG{p}{(}\PYG{n}{counts}\PYG{p}{.}\PYG{n+na}{containsKey}\PYG{p}{(}\PYG{n}{players}\PYG{o}{[}\PYG{l+m+mi}{0}\PYG{o}{]}\PYG{p}{))}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
\PYG{+w}{ }\PYG{k+kt}{int}\PYG{+w}{ }\PYG{n}{newCount}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n}{counts}\PYG{p}{.}\PYG{n+na}{get}\PYG{p}{(}\PYG{n}{players}\PYG{o}{[}\PYG{l+m+mi}{0}\PYG{o}{]}\PYG{p}{)}\PYG{o}{++}\PYG{p}{;}
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
\PYG{+w}{ }\PYG{k}{else}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
\PYG{+w}{ }\PYG{k+kt}{int}\PYG{+w}{ }\PYG{n}{newCount}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{l+m+mi}{1}\PYG{p}{;}
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
\PYG{+w}{ }\PYG{n}{counts}\PYG{p}{.}\PYG{n+na}{put}\PYG{p}{(}\PYG{n}{players}\PYG{o}{[}\PYG{l+m+mi}{0}\PYG{o}{]}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{newCount}\PYG{p}{);}
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
\PYG{+w}{ }\PYG{c+c1}{// find the highest value in the hashmap}
\PYG{+w}{ }\PYG{c+c1}{// will be double what it technically should be for an undirected graph but it doesn't matter}
\PYG{+w}{ }\PYG{k+kt}{int}\PYG{+w}{ }\PYG{n}{highestCount}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{l+m+mi}{0}\PYG{p}{;}
\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{p}{(}\PYG{k+kt}{int}\PYG{+w}{ }\PYG{n}{count}\PYG{+w}{ }\PYG{p}{:}\PYG{+w}{ }\PYG{n}{counts}\PYG{p}{.}\PYG{n+na}{values}\PYG{p}{)}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
\PYG{+w}{ }\PYG{n}{highestCount}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{p}{(}\PYG{n}{count}\PYG{+w}{ }\PYG{o}{\PYGZgt{}}\PYG{+w}{ }\PYG{n}{highestCount}\PYG{p}{)}\PYG{+w}{ }\PYG{o}{?}\PYG{+w}{ }\PYG{n}{count}\PYG{+w}{ }\PYG{p}{:}\PYG{+w}{ }\PYG{n}{highestCount}\PYG{p}{;}
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
\PYG{+w}{ }\PYG{c+c1}{// Set of Players with the highest counts to return}
\PYG{+w}{ }\PYG{n}{Set}\PYG{o}{\PYGZlt{}}\PYG{n}{Player}\PYG{o}{\PYGZgt{}}\PYG{+w}{ }\PYG{n}{mostInfluential}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{k}{new}\PYG{+w}{ }\PYG{n}{HashSet}\PYG{o}{\PYGZlt{}\PYGZgt{}}\PYG{p}{();}
\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{p}{(}\PYG{n}{Player}\PYG{+w}{ }\PYG{n}{player}\PYG{+w}{ }\PYG{p}{:}\PYG{+w}{ }\PYG{n}{counts}\PYG{p}{.}\PYG{n+na}{keySet}\PYG{p}{())}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
\PYG{+w}{ }\PYG{k}{if}\PYG{+w}{ }\PYG{p}{(}\PYG{n}{counts}\PYG{p}{.}\PYG{n+na}{get}\PYG{p}{(}\PYG{n}{player}\PYG{p}{)}\PYG{+w}{ }\PYG{o}{==}\PYG{+w}{ }\PYG{n}{highestCount}\PYG{p}{)}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
\PYG{+w}{ }\PYG{n}{mostInfluential}\PYG{p}{.}\PYG{n+na}{add}\PYG{p}{(}\PYG{n}{player}\PYG{p}{);}
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
\PYG{+w}{ }\PYG{k}{return}\PYG{+w}{ }\PYG{n}{mostInfluential}\PYG{p}{;}
\PYG{p}{\PYGZcb{}}
\end{Verbatim}