algorithm - Union grouping in bipartite graphs? -
algorithm - Union grouping in bipartite graphs? -
i'm trying figure out (and fast) solution next problem:
i have 2 models i'm working with, let's phone call them players , teams. player can on multiple teams , team can have multiple players). i'm working on creating ui element on form allows user select multiple teams (checkboxes). user selecting (or deselecting) teams, i'd display teams grouped players.
so examples:
if selected teams have no players intersect, each team have own section.
if user selects 2 teams , have same players, there 1 section containing names of 2 teams , players.
if team_a has players [1, 2, 4, 5] , team_b has players [1, 3, 5, 6]. there next sections: section_x = [team_a, team_b, 1, 5], section_y = [team_a, 2, 3], section _z = [team_b, 3, 5]
i hope that's clear. essentially, want find teams players have in mutual , grouping that. thinking maybe there way navigating bipartite graph? not sure how though , might overthinking it. hoping creating type of info construction on server , using on client. love hear suggestions , appreciate help can give!
one solution have each player wrapper track selected teams on
class playerwrapper { player player; teamlist teamlist; } class teamlist { private list<team> teams; int hashvalue = // hash value derived teams list void add(team team) { teams.add(team); hashvalue = // update hash value } }
then maintain hash table of player sets, , hash table of player wrappers
hashtable<teamlist, set<player>> playersets hashtable<player, playerwrapper> playerwrappers
when user selects new team, iterate through team's players , retrieve player wrappers playerwrappers
. each player wrapper, retrieve set<player>
playersets
, remove player set, add together new team wrappers teamlist
, retrieve set<player>
playersets
, add together player set.
void updateplayer(team team, player player) { playerwrapper wrapper = playerwrappers.get(player); set<player> set = playersets.get(wrapper.teamlist); set.remove(player); wrapper.teamlist.add(team); set = playersets.get(wrapper.teamlist); set.add(player); }
assuming you're using hash sets set<player>
should on average require constant time process team's player. deselecting team function same way, except you'll remove team wrapper.teamlist
instead of adding it, , you'll have linear time search through teamlist
locate , remove team. utilize of list
in teamlist
assumes ui prevent duplicate teams; careful using set
instead, because may more hard ensure 2 wrappers' teamlists
have same hashvalue (i.e. may need take steps ensure both wrappers' teamlists
homecoming teams in same order - java linkedhashset trick)
algorithm data-structures graph grouping bipartite
Comments
Post a Comment