//Зливаю елементи в одну множину за результатами групування ////////////3 Лаба private List<HashSet<string>> createSet(List<HashSet<int>> groups) { List<HashSet<string>> setElOfGroups = new List<HashSet<string>>(); for(int i = 0; i < groups.Count(); i++) { setElOfGroups.Add(new HashSet<string>()); for(int j = 0; j < groups[i].Count(); j++) { for (int k = 0; k < mas[groups[i].ElementAt(j)].Count; k++) { setElOfGroups[i].Add(mas[groups[i].ElementAt(j)].ElementAt(k)); } } } //setElOfGroups.Sort((a, b) => b.Count - a.Count);//Сортую за кількістю елементів (DESC) return setElOfGroups; }
//Сортування груп з однаковою кількістю елементів за перекриванням найбільшої кількості об'єктів private void sortWithEqualL(List<HashSet<string>> setElAfterV) { List<HashSet<string>> tempSet = new List<HashSet<string>>(); tempSet.Add(setElAfterV[0]); for (int i = 0; i < setElAfterV.Count-1; i++ ) { if (setElAfterV[i].Count == setElAfterV[i + 1].Count) { tempSet.Add(setElAfterV[i + 1]); } else break; } if(tempSet.Count > 1) { List<int> numberOverlapped = new List<int>();//Кількість перекритих об'єктів for (int i = 0; i < tempSet.Count(); i++)//Знаходжу скільки об'єктів перекриває кожна група { numberOverlapped.Add(0);//Початкова кількість перекритих об'єктів for (int k = 0; k < tempSet.Count(); k++) { if (i == k) continue; for (int j = 0; j < groupsAfterV[k].Count; j++) { if (tempSet[i].IsSupersetOf(mas[groupsAfterV[k].ElementAt(j)]))//Являється підмножиною? { numberOverlapped[i]++; } } } } for(int i = 0; i < tempSet.Count; i++) { for (int j = i+1; j < tempSet.Count; j++) { if(numberOverlapped[i] > numberOverlapped[j]) { int temp = numberOverlapped[i]; numberOverlapped[i] = numberOverlapped[j]; numberOverlapped[j] = temp; List<HashSet<int>> tempGroup = new List<HashSet<int>>(); tempGroup.Add(groupsAfterV[i]); groupsAfterV[i] = groupsAfterV[j]; groupsAfterV[j] = tempGroup[0]; List<HashSet<string>> tempEl = new List<HashSet<string>>(); tempEl.Add(setElAfterV[i]); setElAfterV[i] = setElAfterV[j]; setElAfterV[j] = tempEl[0]; } } } } }
//Групування з знаходженням підмножин public void groupsAfterVerification() { groupsAfterV = new List<HashSet<int>>(); setElAfterV= new List<HashSet<string>>(); groupsAfterV.AddRange(groups); setElAfterV.AddRange(createSet(groups)); sortV(groupsAfterV, setElAfterV);//Сортування груп за кількістю елементів sortWithEqualL(setElAfterV);//Сортування груп з однаковою кількістю елементів за перекриванням найбільшої кількості об'єктів for (int i = 0; i < setElAfterV.Count() - 1; i++)//Йду по найбільших групах { for (int k = i+1; k < groupsAfterV.Count(); k++)//Йду по підгрупах { for (int j = 0; j < groupsAfterV[k].Count; j++)//Йду по елементах в групі { if (setElAfterV[i].IsSupersetOf(mas[groupsAfterV[k].ElementAt(j)]))//Являється підмножиною? { groupsAfterV[i].Add(groupsAfterV[k].ElementAt(j));//Додаю елемент групи в групу надмножину groupsAfterV[k].Remove(groupsAfterV[k].ElementAt(j));//Видаляю елемент з підмножини j--; } } } for (int ind = 0; ind < groupsAfterV.Count; ind++)//Видалення пустих рядків { if (groupsAfterV.ElementAt(ind).Count == 0) groupsAfterV.RemoveAt(ind); } setElAfterV.Clear();//Видалив всі групи setElAfterV.AddRange(createSet(groupsAfterV));//Переукомплектовую групи після уточнення sortWithEqualL(setElAfterV);//Сортування груп з однаковою кількістю елементів за перекриванням найбільшої кількості об'єктів } }