Sortowanie elementów w tablicy, tak aby zgromadzić te same elementy, z kolejnością ich pierwszego wstąpienia + wczytywanie z pliku.

0

Tak jak w temacie, problem mam z posortowaniem tego w taki sposób, żeby to rzeczywiście działało. Myślałem nad wykorzystaniem biblioteki <map>, ale chyba do końca jej nie ogarniam. Tak samo z biblioteką <vector>, aby ją wykorzystać podczas pobierania danych z pliku, a potem posortować.

0

Pokaż na przykładzie co chciałbyś osiągnąć

0

wejscie to powiedzmy: [5,3,2,5,5,2,1,4,6], a wyjscie to: [5,5,5,3,2,2,1,4,6]

1

Jaki to ma sens, w jaki sposób prawa lista powstała z lewej?

0

Sortuje tablicę na podstawie pierwszego wystąpienia liczby

1

Przepraszam, ze nie w C++ ale bym to jakos tak zrobil:

nvm, patrz nizej

Jakos to sobie przetlumacz na C++.

EDIT: albo prosciej

xs.sortBy(xs.indexOf(_))

EDIT2: Zlozonosc urosla do n^2, wiec polecam zrobic preprocessing z mapa tak jak jest to zaproponowane w poscie ponizej :)

1

@darek1222: Stwórz sobie mapę <int, int>, gdzie wartością będzie wystąpienie elementu, dla piatki, zero, trójki jeden, (z przykładu), itd., a kluczami będą liczby z tablicy; następnie uzyj tej mapy w funkcji porównującej elementy, którą przekaż do funkcji sortującej. Złożóność równa złożoności sortowania.

5

Prosty pomysł, możliwe, że niekoniecznie najwydajniejszy.

// dla tablicy typu T nazwanej array
std::map<T, size_t> first_seen;
size_t idx{};
for(auto const& element : array) {
    first_seen.insert({element, idx++});
}

std::sort(std::begin(array), std::end(array), [&](auto const& l, auto const& r) {
    return first_seen[l] < first_seen[r];
});

Pisane z głowy, może zawierać błędy

0

To jak juz mamy rozwiazanie to jeszcze powiedz, tak z ciekawosci, jaki problem w ten sposob rozwiazujesz? Czy to tylko takie cwiczenie?

0

Dzięki wielkie za odpowiedz, spróbuje coś z tym zrobić :)
PS Powiedzmy, że ćwiczenie

0

Powiedzmy, że ćwiczenie

Zrób to w O(N).

1
Mózg napisał(a):

Powiedzmy, że ćwiczenie

Zrób to w O(N).

MarekR22 napisał(a):

Tego nie da się zrobić lepiej niż O(n log n) chyba, że masz dodatkową wiedzę na temat zakresu liczb do posortowania, żeby móc zastosować radix sort lub coś w ten deseń

@MarekR22 jaka jest złożoność poniższego algorytmu?

#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

int main()
{
	vector<int> src{5,3,2,5,5,2,1,4,6};
	unordered_map<int,size_t> positions;
	unordered_map<size_t,int> values;
	unordered_map<size_t,unsigned> counts;
	unordered_map<size_t,size_t> orders;
	for(size_t i=0,k=0;i<src.size();++i)
	{
		int value=src[i];
		positions.insert(make_pair(value,i));
		size_t position=positions[value];
		++counts[position];
		if(i==position)
		{
			values[i]=value;
			orders[k++]=i;
		}
	}
	for(size_t k=0;k<orders.size();++k)
	{
		size_t position=orders[k];
		int value=values[position];
		unsigned count=counts[position]; 
		while(count--) cout<<value<<' ';
	}
	return 0;
}
  • Drobna zmiana, wkleiła mi się poprzednia wersja.

1 użytkowników online, w tym zalogowanych: 0, gości: 1