Zwrócenie drugiej i trzeciej maksymalnej wartości z listy

0

Witam, jaką metodą mogę zwrócić drugą i trzecią maksymalną wartość z listy?
Do zwrócenia maksymalnej wartości użyłem metody .Max(). Dzięki za pomoc.

8

Posortuj malejąco i wybierz drugi oraz trzeci wynik.

0

undefined> ##### somekind napisał(a):
Posortuj malejąco i wybierz drugi oraz trzeci wynik.

Dzieki! Ogólnie z szukaniem tej drugiej i trzeciej najwyzszej wartości wykombinowałem na inny sposób, teraz nie wiem który w sumie będzie wydajniejszy, pokaże cały kod. Mam jeszcze jeden dylemat a mianowicie, jak znaleźć ostatnio dodaną wartość z listy?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace hf
{
    class Program
    {
        static void Main(string[] args)
        {

            int a;
            List<long> wyniki = new List<long>();

            Console.WriteLine("Podaj ilosc wynikow: ");
            a = int.Parse(Console.ReadLine());

            for (int j = 0; j < a; j++)
            {
                wyniki.Add(j);
                Console.WriteLine("Podaj wyniki z gry: ");
                wyniki[j] = int.Parse(Console.ReadLine());

            }
            long max = wyniki.Max();

            Console.WriteLine("Najwyzszy wynik: {0}", max);
            wyniki.Remove(max);
            max = wyniki.Max();
            Console.WriteLine("2 z najwyzszych: {0}", max);
            wyniki.Remove(max);
            max = wyniki.Max();
            Console.WriteLine("3 z najwyzszych: {0}", max);

            Console.WriteLine("Ostatnio dodany wynik:" );


            Console.ReadKey();
        }
    }
}
1

Tylko po co robić jakieś Remove i Max wielkrotnie, skoro można raz zrobić OrderBy?

0
Zigor36 napisał(a):

Mam jeszcze jeden dylemat a mianowicie, jak znaleźć ostatnio dodaną wartość z listy?

co masz na myśli? Sam musisz wiedzieć jak są dodane elementy - zapewne na koniec listy, więc po prostu wybierz ostatni element .Last(). Jeśli są dodawane losowo to musisz gdzieś przetrzymywać timestamp dodania - np jako property w klasie / jako tuple<dane, data> w liście czy nawet w osobnej liście. Jeśli potrzebujesz tylko ostatni element to możesz po prostu przy dodawaniu elementu zapamiętać który jest ostatni

jako ciekawostkę do wyjmowania n-tego najwyższego elementu można wykorzystać algorytm Quickselect lub Introselect. Oczywiście dla 3 wartości można zwyczajnie przeiterować raz przez kolekcję i trzymać najwyższe dotychczas znalezione wartości i je podmieniać w razie potrzeby. Dla 22 najwyższej wartości rozwiązanie się robi już bardziej skomplikowane bo trzeba trzymać listę i przez nią iterować żeby znaleźć miejsce wstawienia więc wtedy już warto użyj wyżej wymienione algorytmy (nigdy nie widziałem ich użytych w praktyce)

No jak będziemy chcieli tak wyznaczyć 3 najaktywniejszych użytkowników Facebooka, to można pomyśleć nad optymalizacją. ;)

Takie podejście się lubi szybko mścić. Mieliśmy w projekcie prosty kod sprawdzający czy w liście są duplikaty - ktoś to zaimplementował w najprostszy sposób ze złożonością n^2, wszyscy przy PR olali bo n będzie wynosiło góra kilkaset więc to przecież żaden problem a to tylko mało istotna, krótka część algorytmu. Okazało się że n często wynosi >50 000 a czas prostej operacji, która powinna zająć kilka milisekund - zajmuje średnio po 10 minut i 99% czasu całej operacji. Wszyscy się nauczyli że "Premature Optimization Is the Root of All Evil" i teraz nie chce im się wprowadzać prostych i oczywistych optymalizacji dopóki klient nie będzie narzekał.

1 użytkowników online, w tym zalogowanych: 0, gości: 1