Znajdowanie lidera w zbiorze

Liderem nazywamy taki element n- elementowego zbioru, którego liczba wystąpień jest większa niż n/2.

Działanie algorytmu polega na sprawdzaniu, czy wyznaczona wartość występuje w zbiorze więcej niż n/2 razy. Jeżeli ten warunek jest spełniony, to lider został znaleziony, w przeciwnym wypadku w zbiorze nie ma lidera.

Specyfikacja algorytmu:

Dane: Liczba naturalna: n>0 (liczba elementów tablicy T)
n- elementowa tablica jednowymiarowa zawierająca liczby rzeczywiste: T[0..n-1]

Wynik: Lider znaleziony w tablicy T[0..n-1] lub komunikat informujący, że w tablicy nie ma lidera

Lista kroków:

0. Wczytaj wartości danych n, T[0..n-1]

1. Przypisz lider=T[0] i pom=1

2. Dla kolejnych wartości i: 1, 2, ?, n-1 wykonuj kroki 3- 5, następnie przejdź do kroku 6

3. Jeśli pom=0, wykonaj krok 4, w przeciwnym wypadku przejdź do kroku 5

4. Przypisz lider=T[i] i pom=1

5. Jeśli T[i]=lider, zwiększ pom o 1, w przeciwnym wypadku zmniejsz pom o 1

6. Jeśli pom=0, wypisz komunikat W ZBIORZE NIE MA LIDERA i zakończ algorytm, w przeciwnym wypadku przejdź do kroku 7

7. Przypisz ilosc=0

8. Dla kolejnych wartości i:0, 1,..,n-1 wykonuj krok 9, a następnie przejdź do kroku 10

9. Jeśli T[i]= lider, zwiększ ilosc o 1

10. Jeśli iloss>n/2, wypisz wartość zmiennej lider, w przeciwnym wypadku wypisz komunikat W ZBIORZE NIE MA LIDERA. Zakończ algorytm

Projekt aplikacji desktopowej

lider w zbiorze Visual Studio C#

Wskazówka

Najłatwiejszy sposób wczytania danych do tablicy z kontrolki TextBox to jest wykorzystanie metody Split z klasy String. Tak samo jak robiliśmy to przy obsłudze plików. Metoda Split dzieli wczytany łańcuch znaków na tablicę podłańcuchów. Podział jest zgodny z podanym znakiem separatora.

Wskazówka:


string[] lancuchy = textBox1.Text.Split(' ');
//rozmiar tablict odpowiada rozmiarowi tablicy lancychy
int n=lancuchy.GetLength(0);
t=new int[n];
//wczytaj dane do tablicy
for (int i = 0; i < n; i++)
    t[i] = Convert.ToInt32(lancuchy[i]);

Funkcja działająca według podanych kroków algorytmu

Wskazówka:


string SzukajLidera(int[] t)
{
    string wynik = "BRAK LIDERA";
    int lider = t[0];
    int pom = 1, ilosc = 0;
    for (int i = 1; i < t.GetLength(0); i++)
        if (pom == 0)
        {
            lider = t[i];
            pom = 1;
        }
        else if (t[i] == lider) pom++;
        else pom--;
    if(pom == 0)wynik = "BRAK LIDERA";
    else
    {
        for (int i = 1; i < t.GetLength(0); i++)
            if (t[i] == lider) ilosc++;
        if (ilosc > t.GetLength(0) / 2)
            wynik = String.Format("Liczba {0} jest liderem", lider);
        else wynik = "BRAK LIDERA";
    }
    return wynik;
}

Zadanie

1. Narysuj schemat blokowy algorytmu znajdującego lidera w zbiorze

2. Na podstawie podanego algorytmu napisz aplikację konsolową, w której dane wczytywane są z klawiatury.

Pełne rozwiązanie aplikacji desktopowej

Wskazówka:


using System;
using System.Windows.Forms;

namespace Lider_w_zbiorze
{
    public partial class Form1 : Form
    {
        int[] t;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string[] lancuchy = textBox1.Text.Split(' ');
            //rozmiar tablict odpowiada rozmiarowi tablicy lancychy
            int n=lancuchy.GetLength(0);
            t=new int[n];
            //wczytaj dane do tablicy
            for (int i = 0; i < n; i++)
                t[i] = Convert.ToInt32(lancuchy[i]);
            Text="Rozmiar tablicy zbioru "+n.ToString();
            MessageBox.Show(SzukajLidera(t),
                            "Komunikat",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Information);
        }
        string SzukajLidera(int[] t)
        {
            string wynik = "BRAK LIDERA";
            int lider = t[0];
            int pom = 1, ilosc = 0;
            for (int i = 1; i < t.GetLength(0); i++)
                if (pom == 0)
                {
                    lider = t[i];
                    pom = 1;
                }
                else if (t[i] == lider) pom++;
                else pom--;
            if(pom == 0)wynik = "BRAK LIDERA";
            else
            {
                for (int i = 1; i < t.GetLength(0); i++)
                  if (t[i] == lider) ilosc++;
                if (ilosc > t.GetLength(0) / 2)
                    wynik = String.Format("Liczba {0} jest liderem", lider);
                else wynik = "BRAK LIDERA";
            }
            return wynik;
        }
    }
}
Alkomat- wirtualny test

Alkomat- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
Olinowanie stałe- kalkulator średnic

Olinowanie stałe- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
przepis na gogfry

Przepis na gofry

zobacz
przepis na bitą śmietanę

Przepis na bitą śmietanę

zobacz