• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Algorytm, który sprawdza wszystkie możliwości dodawania

Object Storage Arubacloud
0 głosów
845 wizyt
pytanie zadane 20 października 2017 w C i C++ przez Scypyon Gaduła (3,450 p.)

Zadanie: Mamy liczby załóżmy póki  A,B,C,D,E(wektorowo) Liczba =[x][y]

A = [3][7]

B = [4][6]

C = [6][9]

D = [1][0]

E = [2][2]

Pytanie: Czy jest jakiś sposób ,aby zapisać w pamięci podręcznej wszystkie możliwe kombinacje dodawania każdego x i każdego y? Ale nie tylko dla 5 liczb ale i dla np. 1000. Czyli:

x=  3 + 4 + 6 + 1 + 2 =16    ALE I TEŻ MIESZANIE     x= 3+6+2=11

x=3+4+6+1=14                                                            x=3+4+1=8

x=3+4+6=13                                                               itd...

x=3+4=7

x=3

 

*To samo w przypadku y

 

Nie wiem czy dobrze przekazałem o co mi chodzi, w każdym razie będę wdzięczny za wszelką pomoc.

1 odpowiedź

+1 głos
odpowiedź 20 października 2017 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 20 października 2017 przez Scypyon
 
Najlepsza

Wygląda to na proste wyznaczenie wszystkich kombinacji bez powtórzeń i zsumowanie elementów każdej kombinacji z osobna.

Osobiście wpadłem na pomysł z maską liczb wchodzących do sumowania w postaci liczby dwójkowej z ilością cyfr taką jak ilość x lub y.

Przykład

Dla x:
Maska: 00001 Suma: 3
Maska: 00010 Suma: 4
Maska: 00011 Suma: 3 + 4 = 7
Maska: 00100 Suma: 6
itd...

To samo dla y.

komentarz 20 października 2017 przez obl Maniak (51,280 p.)
Tak, to jest dobry pomysł w takim układzie można obliczyć, że liczebność zbioru będzie sięgać 31 (bo nie liczę sumy 0 elementów). I już widać, że zrobienie czegoś takiego dla 1000 liczb byłoby zbyt czasochłonne i pamięciożerne.
komentarz 20 października 2017 przez Patrycjerz Mędrzec (192,320 p.)

Wg mnie jest to jedno z wydajniejszych rozwiązań. Dla 1000 elementów wystarczy posiadać maskę 1000-elementową, w skrócie 1000 bitów / 8 = 125 bajtów. Nie są to zawrotne wielkości, i tak zapewne do takich liczb nigdy jego program nie dojdzie.

Do opisu swojego algorytmu dodam, że sumę elementów można liczyć z poniższej pętli

#include <cstdlib>

// ...

int index_tab = 0;
while (maska != 0)
{
	if (maska % 2)
	{
		// Dodanie danego elementu do sumy itp.
	}
	maska = div(maska, 2).quot;
	index_tab++;
}

Kod działa na zasadzie wyznaczania kolejnych cyfr maski (od jedności), jeśli dana cyfra jest jedynką, to dodajemy dany element do sumy, jeśli nie, to ten element omijamy. Później obcinamy wyznaczoną cyfrę, inkrementujemy indeks tablicy i algorytm idzie dalej.

Na zewnątrz tej pętli inkrementujemy oryginał maski (ta powyżej była jedynie roboczą kopią) i również powtarzamy kod od nowa, aż maska nie będzie miała wartości

2 ^ ilość_cyfr
komentarz 20 października 2017 przez obl Maniak (51,280 p.)
Tak, ale jeżeli chcesz obliczyć i przechowywać obliczenia wszystkich takich sum dla 1000 liczb to już sam wiesz jak dużo pamięci byś zużył (2 ^ 1000 sum musiałbyś zrobić). Sama maska jest ok i to świetny pomysł ale liczba możliwych do utworzenia sum staje się przytłaczająca.
komentarz 20 października 2017 przez Patrycjerz Mędrzec (192,320 p.)
Nic na to nie poradzę. Matematyka rządzi się swoimi prawami i rzeczywiście liczba sum przy 1000 elementach jest przytłaczająca, no ale nie dotyczy to mojej odpowiedzi, a jedynie problematyki pytania samej w sobie.
komentarz 20 października 2017 przez obl Maniak (51,280 p.)
Jego pytanie brzmi " Czy jest jakiś sposób ,aby zapisać w pamięci podręcznej wszystkie możliwe kombinacje dodawania każdego x i każdego y? " dlatego o tym piszę. Przy małych liczbach da się, ale przy dużych już nie ma tak łatwo.

Z drugiej strony ciekawe do czego to jest potrzebne.
komentarz 20 października 2017 przez Scypyon Gaduła (3,450 p.)
rzeczywiście wypróbowałem sposób i jest klarowny jednak ja potrzebuje przedział do miliona, potrzebne mi to jest do zadania, które już obmyślałem teoretycznie.
komentarz 20 października 2017 przez Scypyon Gaduła (3,450 p.)
rano zobaczę jeszcze jak to wychodzi w sprawdzarce i dam naj. dziękuje bardzo
komentarz 20 października 2017 przez Patrycjerz Mędrzec (192,320 p.)
Milion x i y? I chcesz wyznaczyć sumy dla wszystkich kombinacji? Wydaję mi się, że jest to czasowo i pamięciowo niemożliwe dla zwykłego komputera, ale możesz próbować.
komentarz 20 października 2017 przez mokrowski Mędrzec (155,460 p.)
Tak naprawdę postawienie pytania w inny sposób, pozwala zaproponować mniej zachłanne na zasoby algorytmy. Np.

1. Czy daną wartość sumy można "zbudować" poprzez kombinację bez powtórzeń z liczb?

2. Ile razy wartość występuje pośród sum możliwych do zbudowania z podanych liczb?

3. Jak szybko wyznaczyć podaną sumę spośród liczb?

Nie znam(y) problemu więc jeśli chcesz generować wszystkie sumy, wynikowy kontener może być duży. Zdefiniuj co chcesz zrobić. Być może będzie efektywniejszy i mniej łapczywy na pamięć algorytm :-)
komentarz 20 października 2017 przez Scypyon Gaduła (3,450 p.)
Znaczy w punktacji mam w kryteriach punktowania  do miliona, dlatego taki nacisk na to kładę, a sumy mi są potrzebne, żeby wybrać potem z wyniku dodawania x^2+y^2 największy wynik, to jest tegoroczne zadanie z olimpiady, z którym właśnie sobie poradziłem :)
komentarz 20 października 2017 przez Patrycjerz Mędrzec (192,320 p.)
Obliczyłeś te wszystkie sumy dla miliona x i y? A jak wyglądał czas wykonywania programu oraz jego zużycie pamięci?
komentarz 20 października 2017 przez Scypyon Gaduła (3,450 p.)
no właśnie tu jest problem, póki co mam rozwiązanie z maską i nie wiem czy wrzucać do sprawdzarki, pogadam z profesorem w poniedziałek i zadecyduje, póki co daje naj :) dzięki bardzo
komentarz 20 października 2017 przez Scypyon Gaduła (3,450 p.)
swoją drogą jestem ciekaw jak to sprawdzarka ogarnie :)
komentarz 20 października 2017 przez Patrycjerz Mędrzec (192,320 p.)

Wydaję mi się, że dla takiej ilości kombinacji nie wystarczy ci ani miejsca w RAM-ie, ani na dysku twardym, ani czasu na oczekiwanie na wynik, ale mogę się mylić. Czekam na rezultaty smiley

komentarz 20 października 2017 przez Scypyon Gaduła (3,450 p.)
w takim razie w poniedziałek o 22 dam znać :) Ja tych zadań nie układałem , więc mam związane ręce :) Pewnie jest inny sposób na zrobienie tego, jak cie to interesuje to wpisz w googla "olimpiada informatyczna" i zadanie Pionek :) Pozdrawiam i jeszcze raz dziękuje :)

Podobne pytania

0 głosów
1 odpowiedź 167 wizyt
0 głosów
2 odpowiedzi 10,476 wizyt
pytanie zadane 19 grudnia 2016 w C i C++ przez niezalogowany
0 głosów
0 odpowiedzi 259 wizyt

92,589 zapytań

141,439 odpowiedzi

319,692 komentarzy

61,974 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...