Rozwiązuję wiele problemów, głównie z Top Coder. Otrzymam odpowiedzi na wiele, ale najczęściej kończy się to nieefektywnym rozwiązaniem.
W rzeczywistych implementacjach - czy naprawdę ważne jest, aby rozwiązanie problemu było skuteczne? Jeśli tak, jak mogę to poprawić?
problem-solving
Mrówki
źródło
źródło
Odpowiedzi:
Najlepszym rozwiązaniem jest to, które jest (w kolejności rosnącego znaczenia) wydajne, łatwe w utrzymaniu i wykonane .
^^^ To jedyna rzecz, którą naprawdę musisz wziąć z tej odpowiedzi. ^^^
Wydajność jest ważna . Może trochę mniej niż kiedyś z powodu naszej obfitości sprzętu, ale wydajność jest cechą . W konkursie wydajność jest oczywiście ważna. Powinieneś wiedzieć, jak napisać wydajny kod. Co ważniejsze, powinieneś znać najlepsze praktyki, które pozwolą na uzyskanie wydajnego, dobrze działającego kodu bez poświęcania terminowości lub łatwości konserwacji aplikacji. To właśnie tam głębokość doświadczenia z platformą i językiem zwraca wiele korzyści.
Jednak ważniejsze (w 95% przypadków) jest posiadanie gotowego, łatwego do utrzymania rozwiązania. Bez gotowego produktu , to nie ma znaczenia, w jaki sposób efektywny lub utrzymaniu rozwiązanie. Jeśli śledzenie i naprawianie błędu lub dodawanie nowej funkcji zajmuje Ci wyjątkowo dużo czasu, nie ma znaczenia, jak skuteczne jest to rozwiązanie. Ale wydajność i wydajność są bez wątpienia ważne, bez względu na to, co ktoś może powiedzieć.
źródło
Zgadzam się z Mikiem Cellinim, jedyne co chciałbym dodać to.
Czy coś jest „wystarczająco wydajne”? Na przykład z punktu widzenia użytkownika nie ma dużej różnicy między funkcją, która kończy się w 0,00001 sekundy, a tą, która kończy się w 0,1 sekundy, chociaż jedna jest znacznie bardziej wydajna niż druga. Funkcja, która kończy się w ciągu 10 minut, nie różni się tak bardzo (dla użytkownika) od funkcji, która kończy się w ciągu 12 minut. W obu przypadkach użytkownik dostawałby filiżankę kawy lub zajął się innym zadaniem.
Widziałem wydajność jako „wydajnego użytkownika”, a nie wydajnego algorytmu.
źródło
Ogólnie rzecz biorąc, najważniejszym rozwiązaniem problemu będzie to, które faktycznie istnieje i jest ważne dla przypadków, w których istnieją dla twojego problemu. Innymi słowy, unikaj przedwczesnej optymalizacji, dopóki nie dowiesz się, że masz nieefektywny kod lub wydajny kod, który musi być szybszy.
Nie zapominaj również, że najlepszym rozwiązaniem dla Twojej aplikacji może nie być ogólne rozwiązanie przypadku. Sprawa i punkt, kilka lat temu profesor dał naszej klasie problem, w którym mieliśmy wydrukować pierwsze 10 liczb danego typu (przepraszam, moja pamięć zawodzi mnie co do rodzaju, ale była to jedna z bardziej niezwykłych liczb klasy) i dostaliśmy test, aby sprawdzić, czy liczba jest danego typu. Taki był zakres problemu, który nam powiedziano, i powiedziano nam, że był to następny dzień, a najbardziej wydajne rozwiązanie otrzymało pełny kredyt. Następujący wykład profesor podsumował wyniki:
Ostateczne rozwiązanie zostało ocenione przez profesora jako najbardziej wydajne. Okazuje się, że problem był w rzeczywistości ćwiczeniem polegającym na pełnym zrozumieniu problemu, a nie tylko wychodzeniu i znajdowaniu najskuteczniejszego rozwiązania.
Chodzi o to, że jeśli chodzi o znalezienie skutecznego rozwiązania problemu, zazwyczaj lepiej jest poświęcić czas, aby upewnić się, że naprawdę rozumiesz, na czym polega problem, zanim odejdziesz i napiszesz kod lub spróbujesz zoptymalizować kod. Jeśli możesz przechowywać zestaw wartości referencyjnych w stałej tablicy, lepiej jest robić to z punktu widzenia wydajności niż próbować napisać jakiś wymyślny algorytm.
Podobnie nie zapominaj, że w przypadku większości aplikacji jedynymi osobami, które zwykle widzą nieefektywny kod (gdy nie jest to niepotrzebnie nieefektywny!), Są sami programiści. Jeśli napiszesz czysty kod, który robi dokładnie to, co musi zrobić, istnieje prawdopodobieństwo, że przez większość czasu użytkownicy nie zauważą problemów z wydajnością podczas pracy z twoim programem i po prostu optymalizują części, o których wspominają. ty.
źródło
Zależy to od struktury konkursu, ale generalnie tak: wydajność jest kwestią rozważaną przez większość czasu, zgodnie z ich dokumentacją . Czasami, jak w późniejszym linku, musisz polować, ale cytuj:
Najlepszym sposobem na poprawienie tego jest napisanie wydajnego kodu, co już robisz. Nawet jeśli ukończysz pracę, poświęć czas na jej poprawę - nawet po zawodach - a to się opłaci.
Prawdopodobnie chcesz również zainwestować w teorię, na przykład książki na temat algorytmów , które mogą dać ci dwie rzeczy: bardziej wydajne narzędzia do rozwiązania konkretnego problemu oraz bardziej wydajne mechanizmy do identyfikacji problemu, który musisz rozwiązać.
Ponadto kursy informatyki są coraz częściej dostępne online i obejmują tło, które należy poprawić.
źródło
To, jak efektywne musi być rozwiązanie, zależy od wielu czynników. Najważniejsze jest wiedzieć, czego chce Twój użytkownik. Oto kilka przykładów.
Jak zwiększyć wydajność kodu:
Do optymalizacji jest całe pole, ale dwie powyższe wskazówki powinny przynajmniej zacząć.
źródło
Aby wziąć udział w konkursie, musisz zrozumieć, kim są sędziowie i na czym oni polegają - jeśli szukają świetnych programistów i nic więcej, dostaniesz uznanie za bardziej wydajny kod.
Z reguły w prawdziwym świecie nie ma to znaczenia. Jedną z kluczowych idei rozwoju oprogramowania jest „Nie optymalizuj tego, co nie wymaga optymalizacji”, a następnie „Optymalizuj tylko wtedy, gdy udowodniono, że jest to wymagane”
Wielu praktyków będzie argumentować, że prowadzi to do rozdętego, nieefektywnego kodu, którego nie można łatwo naprawić, aw niektórych przypadkach brzegowych (wokół których będą tłoczyć się, jakby to właśnie robiła większość programistów przez cały dzień) mają rację. Jednak niewiele projektów programistycznych ma zmierzone wyniki. „Wydajność: szybsza niż potrzeba, koszt: kogo to obchodzi, czas dostawy: kiedyś w tej dekadzie”, w prawdziwym świecie zwykle jest to „chcę tanie, chcę wczoraj, chcę to działa ".
źródło