Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Sprawdzenie, czy z zestawu liter można ułożyć podane słowo
messmaker
post 23.03.2010, 20:17:02
Post #1





Grupa: Zarejestrowani
Postów: 106
Pomógł: 5
Dołączył: 5.12.2008

Ostrzeżenie: (0%)
-----


Jak wyżej, mam dane:

  1. $slowo="owsianka";
  2. $pula ="SIANKAOW";


Da się z nich ułożyć słowo. z kolei w przypadku:

  1. $slowo="owsianka";
  2. $pula ="SIANKOW";


Już się nie da (brakuje drugiego A). Głowię się i głowię, najlepsze co do tej pory wymyśliłem to:

Zliczenie do jednej tablicy ilości wszystkich rodzajów liter w słowie i do drugiej tablicy rodzajów liter w puli. Następnie porównałbym kolejne rodzaje i otrzymał oczekiwaną informację. W teorii powinno działać, jednak coś mi mówi, że da się to zrobić łatwiej. Jak?
Go to the top of the page
+Quote Post
lobopol
post 23.03.2010, 20:55:42
Post #2





Grupa: Zarejestrowani
Postów: 1 729
Pomógł: 346
Dołączył: 4.04.2009

Ostrzeżenie: (0%)
-----


A może rozbicie słowa na poszczególne litery i sprawdzanie czy dana litera występuje w tablicy pula, jeżeli tak to usunąć z puli literę i porównywać następny znak z tablicy slowo, jeżeli jest to tak jak poprzednio, jeżeli niema to przerwać operacje. Można by było jeszcze przed rozpoczęciem posortować obie tablice.


--------------------
Go to the top of the page
+Quote Post
wookieb
post 23.03.2010, 20:57:58
Post #3





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  1. function checkWords($word, $chars)
  2. {
  3. $wordLength = strlen($word);
  4. $charsLength = strlen($chars);
  5.  
  6. if($charsLength < $wordLength) return false;
  7.  
  8. for($i=0; $i<$wordLength; $i++)
  9. {
  10. $pos = stripos($chars, $word[$i]);
  11. if($pos===false) return false;
  12. $chars[$pos] = '';
  13. }
  14. return true;
  15. }
  16.  


--------------------
Go to the top of the page
+Quote Post
Zyx
post 23.03.2010, 21:50:55
Post #4





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


messmaker -> podane przez Ciebie rozwiązanie jest w istocie najprostsze i najlepsze. Sposób wookieba to klasyczny algorytm brutalny (sprawdź wszystko na wszystkim), podczas gdy wystarczy w obu słowach posortować litery i porównać otrzymane wyniki. Jeśli operujemy na niedużym alfabecie o znanym porządku, sortowanie można znacznie uprościć do tzw. "sortowania przez zliczanie", czyli dokładnie tego samego, co podałeś. Haczyk leży niestety po stronie PHP, a mianowicie braku po pierwsze wbudowanej funkcji sortującej litery w słowie, a po drugie prawdziwych tablic ze stałym czasem dostępu do elementu, co stawia sensowność takiej implementacji pod znakiem zapytania. Jednak są to już ograniczenia technologii, a nie wada pomysłu jako takiego. Kombinowałeś jak najbardziej we właściwym kierunku.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
wookieb
post 23.03.2010, 21:57:03
Post #5





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Cytat(Zyx @ 23.03.2010, 21:50:55 ) *
podczas gdy wystarczy w obu słowach posortować litery i porównać otrzymane wyniki.

A czy to nie wyglądałoby tak samo jak w moim algorytmie?
Cytat
Haczyk leży niestety po stronie PHP, a mianowicie braku po pierwsze wbudowanej funkcji sortującej litery w słowie,

Nie problem napisac. str_split i sort.



--------------------
Go to the top of the page
+Quote Post
Zyx
post 23.03.2010, 22:22:14
Post #6





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


wookieb -> gdzie Ty u siebie sortowanie widzisz? smile.gif Podany przez Ciebie kod bierze literę z pierwszego słowa, a później skanuje w najgorszym przypadku całe drugie słowo, by sprawdzić czy ona tam jest. To nie ma nic wspólnego z sortowaniem. Zapis w pseudokodzie:

Kod
n = długość(s1); // zakładamy, że s1 i s2 są równej długości
for(i = 0; i < n; i++)
{
   znalazlem = false;
   for(j = 0; j < n; j++)
   {
      if(s1[i] == s2[j])
      {
          znalazlem = true;
          break;
      }
   }
   if(!znalazlem)
   {
      błąd();
   }
}
ok();


W najgorszym przypadku dla słów długości n algorytm wykona n^2 iteracji.

Teraz sposób przez zliczanie:

Kod
slownik1 = inicjuj('a' do 'z' na 0);
slownik2 = inicjuj('a' do 'z' na 0);
n = długość(s1);
for(i = 0; i < n; i++)
{
   slownik1[s1[i]]++;
   slownik2[s2[i]]++;
}
for(i = 'a'; i < 'z'; i++)
{
   if(slownik1[i] != slownik2[i])
   {
      błąd();
   }
}
ok();


Ilość iteracji: n + stały czas na zainicjowanie i sprawdzenie słownika, jeśli znamy jego rozmiary. Ewentualnie można nawet z jednym słownikiem - pierwsze słowo dodaje, drugie odejmuje ilość wystąpień. Jeśli litery w słowach są identyczne, na końcu ilości wystąpień każdej litery będą równe 0.

Ad. 2 -> wiem, że nie problem napisać, ale w PHP to się trochę mija z celem właśnie z powodu, który w cytacie pominąłeś, czyli kosztowność tych operacji.

Ten post edytował Zyx 23.03.2010, 22:23:56


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
wookieb
post 23.03.2010, 22:32:58
Post #7





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Zgodzę się i jak będę miał czas potestuję smile.gif
Co do kosztowności... znasz język programowania który natywnie sortuje litery w słowie? Przecież dla mnie jest to ten sam sposób realizacji.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 11:05