Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

[ROZWIĄZANE] Usuwanie duplikatów z tablicy


Najlepsza odpowiedź GwynBleidD, 07.09.2014 14:53

specialtrie.inc

#include <cellarray>
#include <celltrie>

new Array:g_STrieArray;
new Trie:g_STrieTrie;

/** Inicjalizuje STrie z podaną długością klucza */
stock STrie_init(keysize=1) {
    g_STrieArray = ArrayCreate(keysize=1);
    g_sTrieTrie  = TrieCreate();
}

/** Dodaje klucz na koniec sTrie
 *  zwraca 1 przy powodzeniu, 2 gdy klucz już istnieje.
 */
stock STrie_pushString(const key[], const value[]) {
    
    if (TrieKeyExists(g_STrieTrie, key)
        return 2;

    TrieSetString(g_STrieTrie, key, value);
    ArrayPushString(g_STrieArray, key);

    return 1;
}

/** Pobiera klucz z podanej pozycji */
stock STrie_getKey(item, output[], size) {
    return ArrayGetString(g_STrieArray, item, output, size);
}

Prosty include z 3 stockami. Resztę funkcji, jeśli jest Ci potrzebna, dopiszesz sobie już sam na tym przykładzie. Oczywiście są trochę ułomne, bo nie da się stworzyć 2ch takich struktur w 1 pluginie, ale pokazuję w ten sposób tylko, że nie jest to wcale trudne.

 

Użycie bardzo proste: inicjalizujesz w plugin_init (pamiętaj o określeniu największej długości klucza), zapisujesz nowe wartości gdzie chcesz i przy odczytywaniu lecisz pętlą od 0 do maksymalnej wielkości tablicy, odczytując z niej klucze poprzez getKey. Wartości jeśli nie są Ci potrzebne, wpisz po prostu pusty string.

Przejdź do postu


  • Zamknięty Temat jest zamknięty
16 odpowiedzi w tym temacie

#1 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 27.08.2014 17:19

Witam.

Mógłby ktoś podrzucić kod na usuwanie duplikatów z tablicy?

 

Chodzi o to że mam system wczytywania i po wczytaniu w tablicy są duplikaty. Używam Array


  • +
  • -
  • 0

#2 speedkill

    Godlike

  • Przyjaciel

Reputacja: 1 592
Godlike

  • Postów:2 733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Offline

Napisano 27.08.2014 17:39

Nietestowane:
new g_FirstString[64],
	g_SecondString[64];
		
for(new i = 0; i < ArraySize(g_Array); i++){
	ArrayGetString(g_Array, i, g_FirstString, charsmax(g_FirstString));
		
	for(new g = i + 1; g < ArraySize(g_Array); g++){
		ArrayGetString(g_Array, g, g_SecondString, charsmax(g_SecondString));
		
		if(equal(g_FirstString, g_SecondString)){
			ArrayDeleteItem(g_Array, g);
			g--;
		}
	}
}

  • +
  • -
  • 1

If you can dream it, you can do it.


#3 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 27.08.2014 17:45

Tak myślałem że trzeba zagnieżdżone pętle, ale nie mogłem ogarnąć tych Arrayow xD.

 

A mógłbyś na zwykłe tablice pokazać mi?


  • +
  • -
  • 0

#4 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 27.08.2014 18:04

A co wczytujesz i w jakim celu? Może lepszy byłby do tego słownik?
  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#5 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 27.08.2014 20:22

frakcje od Cypisa. Mogłem napisać na początku.
Za kazdym razem w menu /klasa sprawdzanie jest czy frakcja ktora ma byc dodana, nie jest w menu. Za kazdym razem. Wg mnie lepiej zrobic Array i tam przechowywac frakcje (oczywiscie po jednej z kazdego pliku.
  • +
  • -
  • 0

#6 Puchate

    Wszechobecny

  • Użytkownik

Reputacja: 204
Profesjonalista

  • Postów:433
  • Lokalizacja:Polska
Offline

Napisano 27.08.2014 23:30

 

 

Chodzi o to że mam system wczytywania i po wczytaniu w tablicy są duplikaty

To zrob sprawdzanie przy wczytywaniu pod katem istnienia konkretnych danych, zamiast ladowac wszystko a pozniej przetwarzac tablice na nowo.

 

Ogolnie niestety PAWN jest bardzo tandetny w kwestii zmiennych / tablic i operacjach, np. w PHP to o czym mowisz jest banalne, a tutaj stawia poprzeczke juz na jakimstam poziomie ;) choc wiem ze PHP to zupelnie wziety z nieba przyklad do porownania.


Użytkownik Puchate edytował ten post 27.08.2014 23:31

  • +
  • -
  • 1

#7 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 28.08.2014 05:58

probowalem wyciagnac cos z cpp ale marne skutki.

Zaraz dam caly kod wczytywania.
  • +
  • -
  • 0

#8 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 28.08.2014 09:18

1. Stwórz obok Arraya również Tire, w którym będziesz przechowywał nazwy (możesz sobie dopisać wartości). Operuj na Tire i na Array zawsze jednocześnie, tj to co trafia do Array, trafia również do Tire.

2. Gdy chcesz przejść po wszystkich elementach, iterujesz po Arrayu (jeśli potrzeba Ci pobrać dane przypisane do elementu, pobierasz go również z Tire po kluczu wyciągniętym z Array)

3. Gdy dodajesz wartości, sprawdzasz czy nie istnieją już w Tire. Jeśli nie, dodajesz je zarówno do array lub tire.

4. Gdy chcesz pobrać wartość/sprawdzić czy istnieje, korzystasz z Tire.
  • +
  • -
  • 1

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#9 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1 344
Godlike

  • Postów:3 563
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 02.09.2014 18:07

Trie


GwynBleidD (02.09.2014 21:52):
Tak tak, wiem że nie opona :)

  • +
  • -
  • 2
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D

#10 SeeK

    Wszechobecny

  • Użytkownik

Reputacja: 192
Profesjonalista

  • Postów:438
Offline

Napisano 06.09.2014 20:43

Jeżeli nie zależy Ci na kolejności elementów w tablicy, to posortuj sobie ją alfabetycznie i przelec ją od początku do końca. Stringi które się powtarzają, będą się znajdować koło siebie.

Tylko teraz pytanie, ile masz tych elementów w tablicy. Jeżeli < 10^4, to możesz działać na jednej tablicy i usuwać dane, jeżeli natomiast więcej, to proponuję działać na dwóch tablicach ( do drugiej tablicy dodawać elementy, już bez powtarzania ). W pesymistycznej wersji rozwiązanie z usuwaniem stringów zajmie ilosc_elementow^2 operacji. Przyjmuje się, że 10^8 operacji wykonuje się w ciągu 1sec.
  • +
  • -
  • 0
https://sklep-sms.pl - Sklep SMS pozwala zarabiać na swoich serwerach gier opartych o silniki AMX Mod X oraz SOURCEMOD
https://nalunch.com - A Ty, gdzie pójdziesz dziś na lunch?

#11 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 06.09.2014 21:43

Sortowanie wpisów z pewnością będzie mniej optymalne, niż użycie tandemu Array + Trie. Pobieranie pól z Trie jest bardzo szybkie, gdyż wewnętrznie jest to drzewo binarne, co w praktyce oznacza, że znalezienie odpowiedniego wpisu ma złożoność O(k), gdzie k jest długością poszukiwanego klucza. Sortowanie będzie miało z pewnością większą złożoność.

Jeszcze gorzej wypadnie sytuacja, gdy zajdzie potrzeba wstawienia w konkretnym miejscu nowego klucza, w tablicy będzie to trwało wieki, jeśli będzie duża.

Niestety, w amxx nie ma możliwości iterowania po Trie (czyli przechodzenia w pętli po jego wszystkich wartościach, nie znając ich kluczy) więc musimy się posiłkować tablicą. Jednak użycie tandemu Array + Trie rozwiązuje ten problem. Ucierpi tutaj jedynie złożoność usuwania danych, gdyż usunięcie czegoś ze środka AMXXowego arraya trwa tyle, co dodanie czegoś "w środku", bo wymaga przesunięcia wszystkich danych znajdujących się dalej od tego pola. Dodawanie nie będzie problemem, gdyż zawsze będziemy dodawać na końcu (w tym przypadku kolejność nie będzie miała znaczenia).
  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#12 SeeK

    Wszechobecny

  • Użytkownik

Reputacja: 192
Profesjonalista

  • Postów:438
Offline

Napisano 07.09.2014 13:01

Oj wątpię by to miało złożoność O(k). Jeżeli tak by było, to na złożoność nie miała by wpływu ilość elementów w tej strukturze Trie. Poza tym jak chcesz sprawdzać, czy dany element juz istnieje w Trie?

A po co ma wstawiać nowy element do tablicy? On wszystko wczytuje na początku mapy. Później nie operuje na tablicy.
  • +
  • -
  • 0
https://sklep-sms.pl - Sklep SMS pozwala zarabiać na swoich serwerach gier opartych o silniki AMX Mod X oraz SOURCEMOD
https://nalunch.com - A Ty, gdzie pójdziesz dziś na lunch?

#13 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 07.09.2014 13:35

1. Złożoność w Trie ani trochę nie zależy od ilości elementów, poczytaj sobie o tym czym są drzewa binarne, dowiesz się dlaczego.

2. chyba nie rozumiesz koncepcji całego "wczytywania" o które autorowi chodzi. Wczytuje on skądś informacje właśnie do tablicy, a później w kodzie pluginu na tym operuje. Jaki miałoby to sens w innym wypadku? Po wczytaniu tych elementów może zajść potrzeba przejścia pętlą po nich wszystkich (np po to, by stworzyć menu), czego Trie nie umożliwia (pawn nie ma iteratorów, a Trie nie posiada indeksów liczbowych). Dlatego należy dane zduplikować w tablicy.

Takie rozwiązanie jest wykorzystywane w kilku pluginach, m.in w którymś z pluginów na gangi do JB.
  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#14 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 07.09.2014 13:50

Może rozjaśnie troche

 

 

Na początku wczytuje dane (nazwy), które się powtarzają (string). Potem jest tak, że muszę pętlą jechać po tej tablicy (dodaje do menu te dane) i sprawdzać czy element jest już dodany czy nie. Jako że duplikatów jest około 25, a nie-duplikatów 3, to stwierdziłem, że nie ma sensu jeździć po tych 28 elementach. Wymyśliłem żeby iterować tylko po tych nie duplikatach (3 opcje).

 

Pytać jak coś nie jasne.


  • +
  • -
  • 0

#15 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1 344
Godlike

  • Postów:3 563
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 07.09.2014 14:33

a nie mozesz przy wczytywaniu sprawdzac czy elementu nie ma w tablicy? albo zrobic drugą tablice gdzie dodajesz element jesli go w niej nie ma?


  • +
  • -
  • 0
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D

#16 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 07.09.2014 14:53   Najlepsza odpowiedź

specialtrie.inc

#include <cellarray>
#include <celltrie>

new Array:g_STrieArray;
new Trie:g_STrieTrie;

/** Inicjalizuje STrie z podaną długością klucza */
stock STrie_init(keysize=1) {
    g_STrieArray = ArrayCreate(keysize=1);
    g_sTrieTrie  = TrieCreate();
}

/** Dodaje klucz na koniec sTrie
 *  zwraca 1 przy powodzeniu, 2 gdy klucz już istnieje.
 */
stock STrie_pushString(const key[], const value[]) {
    
    if (TrieKeyExists(g_STrieTrie, key)
        return 2;

    TrieSetString(g_STrieTrie, key, value);
    ArrayPushString(g_STrieArray, key);

    return 1;
}

/** Pobiera klucz z podanej pozycji */
stock STrie_getKey(item, output[], size) {
    return ArrayGetString(g_STrieArray, item, output, size);
}

Prosty include z 3 stockami. Resztę funkcji, jeśli jest Ci potrzebna, dopiszesz sobie już sam na tym przykładzie. Oczywiście są trochę ułomne, bo nie da się stworzyć 2ch takich struktur w 1 pluginie, ale pokazuję w ten sposób tylko, że nie jest to wcale trudne.

 

Użycie bardzo proste: inicjalizujesz w plugin_init (pamiętaj o określeniu największej długości klucza), zapisujesz nowe wartości gdzie chcesz i przy odczytywaniu lecisz pętlą od 0 do maksymalnej wielkości tablicy, odczytując z niej klucze poprzez getKey. Wartości jeśli nie są Ci potrzebne, wpisz po prostu pusty string.


  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#17 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 22.09.2014 00:08

Wiem, że piszę post pod postem ale już mam tego serdecznie dość... Podbijasz wszystkie tematy w których dostałeś już odpowiedź, zamiast z niej po prostu skorzystać... Nie pasuje Ci odpowiedź? Napisz dlaczego! Nie umiesz jej użyć? Napisz gdzie nie rozumiesz! Chcesz mieć więcej metod "bo tak" albo po prostu Ci się nudzi? DAJ SOBIE SPOKÓJ! Bo specjalnie dla Ciebie nie będzie każdy czytał po Nty raz tego samego tematu, tylko dlatego, że masz widzimisię żeby je non stop podbijać... A w tym temacie dostałeś już gotową odpowiedź na kilka sposobów, w tym zalążek biblioteki, którą sobie możesz poprawić i rozwinąć pod własne potrzeby, korzystając tylko z dokumentacji otwartej gdzieś obok... Kod jest prosty i opiera się o użycie 2 modułów, które I TAK są zawsze ładowane, bo są wbudowane w amxx core. Wydajniejszej metody nie znajdziesz, bo w AMXX nie ma Trie ani podobnego bytu po którym można iterować. A pomysły z sortowaniem lub przeczesywaniem tablicy bez sortowania są beznadziejne i lepsze od w/w tylko wtedy, gdy masz pamięci RAM pod serwer na styk, ale procesorem możesz szastać...


  • +
  • -
  • 2

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark





Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych