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.
Posortuj malejąco i wybierz drugi oraz trzeci wynik.
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();
}
}
}
Tylko po co robić jakieś Remove
i Max
wielkrotnie, skoro można raz zrobić OrderBy
?
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ł.