Пример #1
0
        //Зливаю елементи в одну множину за результатами групування
        ////////////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;
        }
Пример #2
0
        //Сортування груп з однаковою кількістю елементів за перекриванням найбільшої кількості об'єктів
        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];
                        }
                    }
                }
            }
        }
Пример #3
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);//Сортування груп з однаковою кількістю елементів за перекриванням найбільшої кількості об'єктів
            }
        }