"Przekręcanie tablicy" C++
-
- Użytkownik
- Posty: 57
- Rejestracja: 22 lip 2006, o 20:50
- Płeć: Mężczyzna
- Lokalizacja: Iława
- Podziękował: 3 razy
"Przekręcanie tablicy" C++
Jaki jest najszybszy i najmniej zjadający pamieć algorytm, ktory mógłby "przekręcic" tablicę n-elementową o k elementów. np. Jeżeli nie jest zbyt jasne to co napisałem, to podaje przykład. Dla 1 2 3 4 5 oraz 2 zrobic 3 4 5 1 2. Bardzo proszę o szybką odpowiedź i z góry dziękuję.
- Szemek
- Użytkownik
- Posty: 4819
- Rejestracja: 10 paź 2006, o 23:03
- Płeć: Mężczyzna
- Lokalizacja: Gdańsk
- Podziękował: 43 razy
- Pomógł: 1407 razy
"Przekręcanie tablicy" C++
osobiście szukałbym czegoś w bibliotece
np. rotate
najlepiej sprawdź sam
większość algorytmów lepiej zastować na vector niż na zwykłą tablicę
np. rotate
najlepiej sprawdź sam
większość algorytmów lepiej zastować na vector niż na zwykłą tablicę
-
- Użytkownik
- Posty: 57
- Rejestracja: 22 lip 2006, o 20:50
- Płeć: Mężczyzna
- Lokalizacja: Iława
- Podziękował: 3 razy
"Przekręcanie tablicy" C++
Jestem dość początkujący. Mógłbyś mi napisać skladnię do tej funkcji na vector?
- Szemek
- Użytkownik
- Posty: 4819
- Rejestracja: 10 paź 2006, o 23:03
- Płeć: Mężczyzna
- Lokalizacja: Gdańsk
- Podziękował: 43 razy
- Pomógł: 1407 razy
"Przekręcanie tablicy" C++
na tablicach
Kod: Zaznacz cały
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
int tablica[]={0,1,2,3,4,5,6,7,8,9};
rotate(tablica,tablica+4,tablica+10);
for(int i=0;i<10;i++)
cout<<tablica[i];
cout<<endl;
int tab[]={1,2,3,4,5};
rotate(tab,tab+2,tab+5);
for(int i=0;i<5;i++)
cout<<tab[i];
}
"Przekręcanie tablicy" C++
Szemek pokazał rozwiązanie takie dość pragmatyczne (w jest wszystko? jeżeli tak, to programowanie jest strasznie nudną dziedziną), ale czy ktoś zaproponuje coś sensownego* robionego na piechotę?
* - pamięciowo: < k, super gdy jeden, czasowo: O(N) bo O(K*(N+1)) jest raczej mało pomysłowe.
* - pamięciowo: < k, super gdy jeden, czasowo: O(N) bo O(K*(N+1)) jest raczej mało pomysłowe.
- kadiii
- Użytkownik
- Posty: 642
- Rejestracja: 20 gru 2005, o 21:04
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Pomógł: 130 razy
"Przekręcanie tablicy" C++
Myślę, że rodzaju złożoności raczej nie zmniejszymy - O(N) wydaje się optymalna. Co do ulepszeń rozwiązania na piechotę to na myśl przychodzą mi dwa: Liczenie przesunięcia modulo długość zadanego ciągu, co spowoduje pominięcie pełnych przebiegów cykli nie zmieniających wyniku końcowego oraz jeżeli długośc ciągu minus wartość przesunięcia jest mniejsza od wartości przesunięcia to zmieniamy kierunek przesuwania i przesuwamy o długość ciągu minus wartość przesunięcia. Dzięki temu wykonamy co najwyżej ceil(l /2) jednostkowych operacji przesunięcia, gdzie l to długość zadanego ciągu. Nie zmienia to faktu, że sama operacja przesunięcia jest chyba trudna do usprawnienia?
-
- Użytkownik
- Posty: 57
- Rejestracja: 22 lip 2006, o 20:50
- Płeć: Mężczyzna
- Lokalizacja: Iława
- Podziękował: 3 razy
"Przekręcanie tablicy" C++
Moim zadanie jest takie.
Mam 2 ciagi znakow i mam sprawdzic, czy jeden jest identyczny z drugim lub jest jego 'przekreceniem' jezeli wiecie o co chodzi. obracanie tablicy nie za wiele dalo, gdyz obliczenia dla dlugich ciagow byly bardzo dlugie. Sprobowalem wiec po prostu odwolywac sie do nastepnych elementow uzywajac modulo... Niestety program zawsze wypisuje mi, ze nie. Jezeli bylby ktos sklonny spojrzec w to i zobaczyc, co moze byc zle, bede bardzo wdzieczny.
Mam 2 ciagi znakow i mam sprawdzic, czy jeden jest identyczny z drugim lub jest jego 'przekreceniem' jezeli wiecie o co chodzi. obracanie tablicy nie za wiele dalo, gdyz obliczenia dla dlugich ciagow byly bardzo dlugie. Sprobowalem wiec po prostu odwolywac sie do nastepnych elementow uzywajac modulo... Niestety program zawsze wypisuje mi, ze nie. Jezeli bylby ktos sklonny spojrzec w to i zobaczyc, co moze byc zle, bede bardzo wdzieczny.
Dane ciagi maja oczywiscie taka sama ilosc elementow.#include
#include
#include
using namespace std;
int main(void)
{
char ciag1[50000];
char ciag2[50000];
bool log=0;
int t;
cin >> t;
for(int i=0;i> ciag1;
cin >> ciag2;
for(int ii=0;ii
Ostatnio zmieniony 17 sty 2008, o 22:40 przez Papkin, łącznie zmieniany 1 raz.
-
- Użytkownik
- Posty: 374
- Rejestracja: 21 cze 2007, o 11:28
- Płeć: Mężczyzna
- Lokalizacja: Łostowice
- Pomógł: 146 razy
"Przekręcanie tablicy" C++
Jeśli tylko o to chodzi to wystarczy dzielić przez liczbę równą mniej więcej długości łańcucha zamiast 60 tys, wtedy wynik wydaje mi się nieco bardziej przewidywalny.
Kod: Zaznacz cały
#include <iostream>
#include <string>
using namespace std;
int main(void) {
char ciag1[60000];
char ciag2[60000];
bool log = 0;
unsigned int t;
cout << "Podaj ilosc sprawdzen ";
cin >> t;
for(unsigned int i = 0; i < t; i++) {
cout << "Podaj ciag1 ";
cin >> ciag1;
cout << "Podaj ciag2 ";
cin >> ciag2;
unsigned dlugosc = strlen(ciag1);
for(unsigned int ii = 0; ii < dlugosc; ii++) {
log = 0;
for(unsigned int iii = 0; iii < dlugosc; iii++) {
if (ciag1[iii] != ciag2[(iii + ii) % dlugosc]) {
log = 1;
break;
}
}
if (log == 0)
break;
}
if(log==0)
cout << "tak" << endl;
else
cout << "nie" << endl;
}
return 0;
}
-
- Użytkownik
- Posty: 57
- Rejestracja: 22 lip 2006, o 20:50
- Płeć: Mężczyzna
- Lokalizacja: Iława
- Podziękował: 3 razy
"Przekręcanie tablicy" C++
Dziękuję za pomoc w znalezieniu błędu i wszystkie informacje. Temat można już usunąć.
- Undre
- Użytkownik
- Posty: 1430
- Rejestracja: 15 lis 2004, o 02:05
- Płeć: Mężczyzna
- Lokalizacja: UĆ
- Podziękował: 3 razy
- Pomógł: 92 razy
"Przekręcanie tablicy" C++
Tematów się tu nie usuwa, nie po to jest forum. Jeśli zależy ci na szybkości, to podejrzewam, że wszystkie powyższe kody można przebić dobrą wstawką asemblerową, ale to już nie bardzo C++ więc
-
- Użytkownik
- Posty: 374
- Rejestracja: 21 cze 2007, o 11:28
- Płeć: Mężczyzna
- Lokalizacja: Łostowice
- Pomógł: 146 razy
"Przekręcanie tablicy" C++
Jeśli chodzi o przyspieszenie porównania dla duzych tablic, to jest sporo możliwości.
Zaproponowany algorytm to prawie brute force.
Dla dużych tablic znaczne przyspieszenie da wyliczenie dla tablicy pewnych wskaźników, które powinny być równe dla ciągów z przesunięciem i porównanie ich, jeżeli będą się różnić od razu będzie wiadomo, że ciągi nie róznią się tylko przesunięciem.
Przykładowe wskaźniki to
- suma liczb w ciągu
- minimalna i maksymalna wartość elementu
- liczba skoków dodatnich ( i ujemych), czyli ile razy element n + 1 jest większy od n.
Zaproponowany algorytm to prawie brute force.
Dla dużych tablic znaczne przyspieszenie da wyliczenie dla tablicy pewnych wskaźników, które powinny być równe dla ciągów z przesunięciem i porównanie ich, jeżeli będą się różnić od razu będzie wiadomo, że ciągi nie róznią się tylko przesunięciem.
Przykładowe wskaźniki to
- suma liczb w ciągu
- minimalna i maksymalna wartość elementu
- liczba skoków dodatnich ( i ujemych), czyli ile razy element n + 1 jest większy od n.