Spredsort

Spredsort je algoritam sortiranja koji kombinuje koncepte razvrstavanja, poput onih u sortiranju višestrukim razvrstavanjem ili segmentom sortiranju, sa elementima particionisanja iz algoritama poput kviksort i sortiranja spajanjem. Algoritam je izmislio Stiven J. Ros i objavio 2002. godine u radu "Spredsort: Opšti algoritam sortiranja visokih performansi".[1] U praksi se pokalazalo da je algoritam vrlo efikasan, ali s druge strane dosta komplikovaniji za implementaciju, od ostalih sličnih algoritama.

Algoritam

Kviksort koristi pivot kako bi podelio listu na dva dela, jedan u kome su vrednosti elemenata manji od pivota i drugi u kome su one veće. Ova ideja se generalizuje u spredsortu. U spredsortu se lista particioniše na n/c dela u svakom koraku, gde je n ukupan broj elemenata u listi a c mala konstanta. U praksi konstanta uzima vrednosti od 4 do 8, za slučejeve kada su nizovi dugački, dok za kraće nizove može imati veće vrednosti. Razvrstavanje se postiže na sličan način kao i u ostalim sortiranjima, prvo se pronađu najmanja i najveća vrednost u nizu, a zatim se opseg vrednosti između njih razdeli na n/c korpe jednake veličine. U slučaju kada je broj korpi jednak broju elemenata, spredsort se degeneriše u segmentno sortiranje i algoritam staje. Inače, svaka korpa se sortira rekurzivno, pri čemu se uz pomoć heuristika za svaku korpu testira da li je efikasnije tu korpu sortirati spredsortom ili nekim drugim klasičnim algoritmom.

Kada je keširanje problem, broj korpi po iteraciji razvrstavanja se može ograničiti. Posledica ovakvog ograničavanja je veći broj iteracija samog procesa razvrstavanja. S druge strane smanjuje se broj grešaka pri keširanju što dovodi do bržeg rada algoritma u opštem slučaju.

Kao i kod drugih sortiranja razvrstavanjem, spreadsort pri implementaciji zahteva da programer osmisli na koji način će svoje elemente pretvoriti u numeričke vrednosti tj. ključeva na osnovu kojih će algoritam odrediti kojoj korpi koj element pripada.

Performanse

Kako svaka korpa može biti sortirana drugim algoritmom sortiranja, vremenska složenost u najgorem slučaju upravo zavisi od najgorih vremenskih složenosti u korpama. U slučaju sortiranja korpe spajanjem to je O(n log n), dok ukoliko je korišćen kviksort O(n2). U slučajevima kada je prosečna veličina ključa u bitovima puta dva, manja od kvadrata logaritma veličine niza (2k < log(n)2, gde je k - broj bitova ključa, n - dužina niza), spredsort ima bolje performanse u najgorem slučaju i to O(n·(k - log(n)).5) u ogrinalnoj verziji, i O(n·((k/c) + c)) za unapređenu verziju koja vodi računa o problemima s keširanjem.

Optimizovanija verzija algoritma je poređena sa visoko-optimizovanim C++ std::sort, koji je implementiran introsortom. U nizovima celobronih vrednosti, kao i onih sa decimalama, spredsort sortira dva do sedam puta brže na raznim operativnim sistemima.[1]

Što se tiče prostorne složenosti, spredsort je gori od većine standardnih algoritama. U najosnovnijem obliku spredsort koristi O(n) dodatnog memorijskog prostora. U eksperimentima se pokazalo da osnovni spredsort koristi i do 20% više memorije od najpopularnijeg kviksorta, kada konstanta c ima vrednosti od 4 do 8. Optimizovana verzija koja smanjuje greške u keširanju koristi manje memorije zbog činjenice da se u njoj postavlja gornja granica korišćenja memorije, ograničavanjem maksimalnog broja korpi po iteraciji. Iako koristi asimptotski više prostora od kviksorta O(log n) ili hipsorta O(1), spredsort koristi značajno manje prostora od osnovnih oblika sortiranja spajanjem koji koriste onliko dodatnog prostora koliki je niz. Spredsort radi vrlo efikasno kada je neophodno sortirati ogromne nizove elemenata koju su preveliki da stanu u memoriju, te zahtevaju i dodatni prostor na disku.


Implementacija

unsigned 
RoughLog2(DATATYPE input) 
{
	unsigned char cResult = 0;
	// && je neophodno da bi se izbegle beskonačne petlje
	if(input >= 0)
		while((input >> cResult) && (cResult < DATA_SIZE)) cResult++;
	else
		while(((input >> cResult) < -1) && (cResult < DATA_SIZE)) cResult++;
	return cResult;
}
SIZETYPE
GetMaxCount(unsigned logRange, unsigned uCount)
{
	unsigned logSize = RoughLog2Size(uCount);
	unsigned uRelativeWidth = (LOG_CONST * logRange)/((logSize > MAX_SPLITS) ? MAX_SPLITS : logSize);
	if(DATA_SIZE <= uRelativeWidth)
		uRelativeWidth = DATA_SIZE - 1;
	return 1 << ((uRelativeWidth < (LOG_MEAN_BIN_SIZE + LOG_MIN_SPLIT_COUNT)) ? 
		(LOG_MEAN_BIN_SIZE + LOG_MIN_SPLIT_COUNT) : uRelativeWidth);
}

void 
FindExtremes(DATATYPE *Array, SIZETYPE uCount, DATATYPE & piMax, DATATYPE & piMin)
{
	SIZETYPE u;
	piMin = piMax = Array[0];
	for(u = 1; u < uCount; ++u){
		if(Array[u] > piMax)
			piMax=Array[u];
		else if(Array[u] < piMin)
			piMin= Array[u];
	}
}	

//---------------------SpreadSort Source-----------------

Bin *
SpreadSortCore(DATATYPE *Array, SIZETYPE uCount, SIZETYPE & uBinCount, DATATYPE &iMax, DATATYPE &iMin)
{
        // Ovaj korak traje 10% ukupnog vremena izvršavanja ali pomaže 
        // za izbegavanje najgoreg slučaja. Ukoliko se unapred znaju min i max
        // ovaj korak može da se preskoči u prvoj iteraciji.
	FindExtremes((DATATYPE *) Array, uCount, iMax, iMin);
	if(iMax == iMin)
		return NULL;
	DATATYPE divMin,divMax;
	SIZETYPE u;
	int LogDivisor;
	Bin * BinArray;
	Bin* CurrentBin;
	unsigned logRange;
	logRange = RoughLog2Size((SIZETYPE)iMax-iMin);
	if((LogDivisor = logRange - RoughLog2Size(uCount) + LOG_MEAN_BIN_SIZE) < 0)
		LogDivisor = 0;
        // Donja if naredba je neophodna kod sistema u kojima je memorija
	// znatno sporija od procesora.
	if((logRange - LogDivisor) > MAX_SPLITS)
		LogDivisor = logRange - MAX_SPLITS;
	divMin = iMin >> LogDivisor;
	divMax = iMax >> LogDivisor;
	uBinCount = divMax - divMin + 1;
	

	BinArray = calloc(uBinCount, sizeof(Bin));
    if(!BinArray) {
		printf("Using std::sort because of memory allocation failure\n");
		std::sort(Array, Array + uCount);
		return NULL;
	}
		
	// Proračunavanje veličina za svaku korpu. 10% vremena izvršavanja.
	for(u = 0; u < uCount; ++u)
		BinArray[(Array[u] >> LogDivisor) - divMin].uCount++;
	// Dodeljivanje pozicija korpama.
	BinArray[0].CurrentPosition = (DATATYPE *)Array;
	for(u = 0; u < uBinCount - 1; u++) {
		BinArray[u + 1].CurrentPosition = BinArray[u].CurrentPosition + BinArray[u].uCount;
		BinArray[u].uCount = BinArray[u].CurrentPosition - Array;
	}
	BinArray[u].uCount = BinArray[u].CurrentPosition - Array;
	
	// Razmenjivanje vrednosti. Ovo oduzima većinu vremena izvršavanja.
	// std::sort pozivi takođe.
	for(u = 0; u < uCount; ++u) {
		for(CurrentBin = BinArray + ((Array[u] >> LogDivisor) - divMin); (CurrentBin->uCount > u); 
			CurrentBin = BinArray + ((Array[u] >> LogDivisor) - divMin))
				SWAP(Array + u, CurrentBin->CurrentPosition++);
		// Now that we've found the item belonging in this position,
		// increment the bucket count
		if(CurrentBin->CurrentPosition == Array + u)
			++(CurrentBin->CurrentPosition);
	}
	
	// Preskače se rekurzija ako je sortirano segmentim sortiranjem
	if(!LogDivisor) {
		free(BinArray);
		return NULL;
	}
	return BinArray;
}

void
SpreadSortBins(DATATYPE *Array, SIZETYPE uCount, SIZETYPE uBinCount, const DATATYPE &iMax
				, const DATATYPE &iMin, Bin * BinArray, SIZETYPE uMaxCount)
{
	SIZETYPE u;
	for(u = 0; u < uBinCount; u++){
		SIZETYPE count = (BinArray[u].CurrentPosition - Array) - BinArray[u].uCount;
		// Ne sortira se ukoliko ima manje od 2 korpe.
		if(count < 2)
			continue;
		if(count < uMaxCount)
			std::sort(Array + BinArray[u].uCount, BinArray[u].CurrentPosition);
		else
			SpreadSortRec(Array + BinArray[u].uCount, count);
	}
	free(BinArray);
}

void 
SpreadSortRec(DATATYPE *Array, SIZETYPE uCount)
{
	if(uCount < 2)
		return;		
	DATATYPE iMax, iMin;
	SIZETYPE uBinCount;
	Bin * BinArray = SpreadSortCore(Array, uCount, uBinCount, iMax, iMin);
	if(!BinArray)
		return;
	SpreadSortBins(Array, uCount, uBinCount, iMax, iMin, BinArray,
	 GetMaxCount(RoughLog2Size((SIZETYPE)iMax-iMin), uCount));
}

Poboljšanje i primenljivost

Jedan od rezultata testiranja spredsorta jeste da on može postati složenosti O(n) ukoliko su ulazni podaci vrednosti neprekidne integrabilne funkcije.[2] Ova složenost se postiže tako što se modifikuje algoritam da uvek izvrši dve iteracije, ukoliko je posle prvog prolaza pravljenja korpi broj korpi veći od određene konstantne vrednosti. Ukoliko je poznato da ulazne vrednosti zadovoljavaju gore spomenuti kriterijum ovakva modifikacija dovodi do znatnog poboljšanja rada. Ovako modifikovan spredsort ima i bolje performanse u najgorem slučaju. Jedini problem kod ove verzije algoritma predstavlja činjenica da se ne može garantovati ispunjenje uslova, kao i to da ova izmena usporava sortiranje baš kada uslov nije ispunjen.

Reference

  1. ^ а б Steven J. Ross. The Spreadsort High-performance General-case Sorting Algorithm. Parallel and Distributed Processing Techniques and Applications, Volume 3. стр. 1100-1106. Las Vegas Nevada. 2002.
  2. ^ Markku Tamminen: Two Levels are as Good as Any. J. Algorithms. 6 (1): 138—144. 1985.  Недостаје или је празан параметар |title= (помоћ)

Read other articles:

Rancho Santa Fe Spitzname: The Ranch, Rancho Lage in Kalifornien Rancho Santa Fe (Kalifornien) Rancho Santa Fe Basisdaten Staat: Vereinigte Staaten Bundesstaat: Kalifornien County: San Diego County Koordinaten: 33° 1′ N, 117° 12′ W33.023888888889-117.275Koordinaten: 33° 1′ N, 117° 12′ W Zeitzone: Pacific (UTC−8/−7) Einwohner: 3.156 (Stand: 2020) Haushalte: 961 (Stand: 2020) Fläche: 17,581 km² (ca. 7 mi²)d...

يو-1228   الجنسية  ألمانيا النازية الشركة الصانعة دويتشه ويرفت  المالك  كريغسمارينه المشغل بحرية الولايات المتحدةكريغسمارينه (22 ديسمبر 1943–8 مايو 1945)[1]  المشغلون الحاليون وسيط property غير متوفر. المشغلون السابقون وسيط property غير متوفر. التكلفة وسيط property غير متوفر....

Nueve (jaringan TV Meksiko)Logo digunakan sejak 17 Juni 2017Nama sebelumnyaTelevision Independiente de Mexico GalavisiónJenisTerrestrial television networkNegaraMexicoTanggal peluncuran1968PemilikTelevisaSitus webGala TV Nueve adalah salah satu stasiun televisi Meksiko yang didirikan oleh Televisa.[1] Program Telenovela Saat ini Telenovelas: Dama y Obrero (October 21, 2013–present) Gata Salvaje (May 17, 2013-present) Marido en Alquiler (October 9, 2013–present) Santa Diabla ...

2008 single by Carola Häggkvist & Andreas JohnsonLucky StarSingle by Carola Häggkvist & Andreas JohnsonReleased15 January 2008Recorded2007GenrePopLabelWarner MusicCarola Häggkvist & Andreas Johnson singles chronology I denna natt blir världen ny (2007) Lucky Star (2008) One Love (2008) Lucky Star is a song by Swedish singers Carola Häggkvist & Andreas Johnson. It was released as digital download on 15 January 2008 in Sweden. It reached number 13 on the Swedish Singles Cha...

Play by Christopher Hampton Les liaisons dangereusesPoster for the 2008 Roundabout Theatre Company productionWritten byChristopher HamptonDate premiered24 September 1985Place premieredThe Other PlaceStratford-upon-AvonOriginal languageEnglishSubjectA tale of seduction, revenge, and human maliceGenreDramaSettingVarious salons and boudoirs in hotels and châteaux in and around Paris and the Bois de Vincennes during an autumn and winter in the late 1780s Les Liaisons dangereuses (French: [le...

Light rail system in San Jose, California VTA light railA VTA light rail train at Winchester station in February 2019OverviewLocaleSanta Clara County, CaliforniaTransit typeLight railNumber of lines3Number of stations60[1]Daily ridership13,300 (weekdays, Q2 2023)[2]Annual ridership3,559,900 (2022)[3]Websitevta.orgOperationBegan operationDecember 11, 1987; 35 years ago (1987-12-11)[1]Operator(s)Santa Clara Valley Transportation AuthorityNu...

Overview of tourism in Sri Lanka This article's lead section may be too short to adequately summarize the key points. Please consider expanding the lead to provide an accessible overview of all important aspects of the article. (January 2021) Hikkaduwa beach Tourists in Ravana Falls Tourism in Sri Lanka is growing rapidly. For centuries, Sri Lanka has been a popular place of attraction for foreign travelers. The Chinese traveler Fa-Hien visited Sri Lanka as early as the 410's AD/CE, and in th...

See also: 2024 United States gubernatorial elections 2024 Utah gubernatorial election ← 2020 November 5, 2024 2028 →   Party Republican Democratic Incumbent Governor Spencer Cox Republican Elections in Utah Federal government Presidential elections 1896 1900 1904 1908 1912 1916 1920 1924 1928 1932 1936 1940 1944 1948 1952 1956 1960 1964 1968 1972 1976 1980 1984 1988 1992 1996 2000 2004 2008 2012 2016 2020 2024 Presidential primaries Democratic 2000 2004 2008 2016 20...

Art produced by the Ancient Egyptian civilization Egyptian art redirects here. For the art of modern Egypt, see Contemporary art in Egypt. Art of ancient EgyptThe Mask of Tutankhamun; c. 1327 BC; gold, glass and semi-precious stones; height: 54 cm (21 in); Egyptian Museum (Cairo)Menna and Family Hunting in the Marshes, Tomb of Menna, 14th Century BCEThe Great Pyramid of Giza, constructed between c. 2580–2560 BC during the Old Kingdom period History of art Per...

The examples and perspective in this article may not represent a worldwide view of the subject. You may improve this article, discuss the issue on the talk page, or create a new article, as appropriate. (November 2019) (Learn how and when to remove this template message) Part of series onRadio Forms Radio (overland) Satellite radio Internet radio Uses and forms Talk radio Internet talk radio Music radio Call-in (radio) Developments Radio station Most listened-to programs Physics and engineeri...

American legislative district New Jersey's 27th legislative districtSenatorRichard Codey (D)Assembly membersMila Jasey (D)John F. McKeon (D)Registration43.7% Democratic20.4% Republican35.4% unaffiliatedDemographics61.7% White12.9% Black/African American0.2% Native American13.1% Asian0.0% Hawaiian/Pacific Islander4.1% Other race8.0% Two or more races10.0% HispanicPopulation233,779Voting-age population180,070Registered voters189,871 New Jer...

See also: Aegean Army Fourth ArmyDjemal Pasha and Fuad Bey (April 1917)Active?-?7 September 1914 – 26 September 1918Country Ottoman EmpireTypeField ArmyGarrison/HQBaghdad, DamascusPatronSultans of the Ottoman EmpireEngagementsSinai and Palestine Campaign (World War I)CommandersNotablecommandersZeki Pasha (September – 18 November 1914)Djemal Pasha (18 November 1914 – September 1917)Mersinli Djemal Pasha (September 1917 – October 1918)Military unit The Fourth Army of the Ottoman Em...

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada Februari 2023. Callidium scutellare Klasifikasi ilmiah Kerajaan: Animalia Filum: Arthropoda Kelas: Insecta Ordo: Coleoptera Famili: Cerambycidae Genus: Callidium Spesies: Callidium scutellare Callidium scutellare adalah spesies kumbang tanduk panjang yang tergolong ...

Cave temple associated with the Mahāsāṃghika sect. Ajaṇṭā Caves, Mahārāṣtra, India Part of a series onEarly Buddhism Scriptures Early Buddhist Texts (EBT) Tripiṭaka Nikayas Āgamas Gandhāran EBTs Prātimokṣa Abhidharma Jatakas Avadanas Mahāvastu Śālistamba Sūtra Tibetan EBTs in the Kangyur Early sangha Gautama Buddha Sāriputta Mahāmoggallāna Mahāpajāpatī Gotamī Mahakasyapa Ānanda Upāli Mahākātyāyana Devadatta Anāthapiṇḍika Pre-sectarian Buddhism Kingdom ...

Cruise line operation, subsidiary of The Walt Disney Company Disney Cruise LineDisney Cruise Line terminal in Port CanaveralTrade nameDisney Cruise LineFormerlyDisney Vacation CruisesDevonson Cruise Company, LimitedTypeSubsidiaryIndustryTourismFoundedMay 3, 1995; 28 years ago (May 3, 1995)HeadquartersCelebration, Florida, United StatesNumber of locations3Areas servedAfricaAlaska and the Pacific CoastAsiaBahamasCaribbeanEuropeCanadaOceaniaLatin AmericaKey peopleThomas Mazloum (Pre...

Municipio de Santa Bárbara Municipio Escudo Lema: Valor, trabajo y hospitalidad Ubicación del municipio en ChihuahuaCoordenadas 26°48′00″N 105°47′00″O / 26.8, -105.78333333333Cabecera Santa BárbaraEntidad Municipio • País México • Estado ChihuahuaPresidente municipal José Antonio Bilbao Martínez (2018-2021)[1]​Eventos históricos   • Creación 1567Superficie   • Total 424.20 km²Altitud   • Media 2117 m s...

Adrián Álvarez Ruiz Retrato de Adrián Álvarez Ruiz por Eulogia Merle.Información personalNacimiento 1884Barruelo de Santullán (España) Fallecimiento 1950Nacionalidad EspañolaInformación profesionalOcupación Inventor y trabajador ferroviario Empleador Compañía de los Ferrocarriles de Madrid a Zaragoza y Alicante [editar datos en Wikidata] Adrián Álvarez Ruiz (n. Barruelo de Santullán, Palencia, España, 1884 - f. 1950) fue un inventor español. Biografía De su pueblo ...

Village in Estonia Village in Pärnu County, EstoniaPaadremavillagePaadremaLocation in EstoniaCoordinates: 58°31′54″N 23°49′58″E / 58.53167°N 23.83278°E / 58.53167; 23.83278CountryEstoniaCountyPärnu CountyMunicipalityLääneranna ParishPopulation (01.01.2011[1]) • Total37 Paadrema is a village in Lääneranna Parish, Pärnu County, in southwestern Estonia. It had a population of 37 on 1 January 2011.[1] Paadremaa is the bir...

Mountain in the country of Japan Mount Takami高見山Mount Takami from Hirano(January 2009)Highest pointElevation1,248.3 m (4,095 ft)ListingList of mountains and hills of Japan by heightCoordinates34°25′44″N 136°05′17″E / 34.429°N 136.088°E / 34.429; 136.088NamingLanguage of nameJapaneseGeographyLocationOn the border of Higashiyoshino, Nara, and Matsusaka, Mie, JapanParent rangeDaiko Mountains Mount Takami (高見山, Takami-san/Takami-yama)...

هذه المقالة بحاجة لصندوق معلومات. فضلًا ساعد في تحسين هذه المقالة بإضافة صندوق معلومات مخصص إليها. يفتقر محتوى هذه المقالة إلى الاستشهاد بمصادر. فضلاً، ساهم في تطوير هذه المقالة من خلال إضافة مصادر موثوق بها. أي معلومات غير موثقة يمكن التشكيك بها وإزالتها. (ديسمبر 2018) وزير ا...