Что нового

[Массивы] Помогите реализовать сложную сортировку

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Раз других предложение не поступило, то берём критерий
отсортировать так, чтобы каждая следующая строка максимально повторяла предыдущую

файл данных
4.jpg;"126127128130131132133134135136137139140141146147148153154155156157158159160163164165166170171172175176177182183184187188189190194195196;"
5.jpg;"126127128130131132133135136137138141142143144147148149152153154158159160161162163164170171172174175176;"
6.jpg;"126127128130131132133135136137138141142143144148149150151152153159160161162163164165166;"
7.jpg;"126127128130131132133135136137142143144149150151152153154160161162164165166;"
8.jpg;"126127128130131132133136137138144145146149150151152;"
9.jpg;"126127128130131132134135136137139140141146147148153154155156157158159160163164165166170171172175176177182183184187188189190194195196;"
10.jpg;"126127128130131132135136137142143144147148149154155156159160161162163164169170171172176177178181182183187188189190;"
11.jpg;"126127128130131132135136137142143144149150151152153154160161162164165166;"
12.jpg;"126127128130131132135136137142143144149150151153154155156159160161167168169174175176181182183185186187190191192197198199201202203206207208212213214215;"
13.jpg;"126127128130131132135136137142143144150151153154155156159160161167168169174175176181182183185186187190191192197198199201202203206207208212213214215;"
14.jpg;"126127128131132133134135136137142143144148149150151;"
15.jpg;"126127128131132133134135136137142143144148149150151154155156157158159160166167168172173174175176177178179180;"
16.jpg;"126127128131132133134135136142143144148149150151154155156157158159160166167168172173174175176177178179180;"
17.jpg;"126127128131132133134135136144145146147148149150153154155156157158163164165166170171172177178179181182183185186187;"
18.jpg;"126127128131132133134137138139140142143144146147148151152153154155156157162163164169170171173174175176180181182188189190191195196197198199200201202203;"

Скрипт
Код:
#Include <Array.au3>
#include <Math.au3>

$label='vaf.txt'

$bar = _fill($label)
_ArrayDisplay($bar,"прочитано")
$VAF = _poehali($bar)
_ArrayDisplay($VAF,"отсортировано")

Func _poehali($aVAF)
	Local $N = $aVAF[0]
	Local $aRes[$N+1]
	$aRes[0] = $N
	$aRes[1] = $aVAF[1]
	_ArrayDelete($aVAF,1)
	Local $Nv = $N-1
	Local $maxEst, $maxIndex
	For $i=2 To $N
		$maxEst = -1
		For $j = 1 To $Nv
			$ee = _drink($aRes[$i-1],$aVAF[$j])
			If $ee > $maxEst Then
				$maxEst = $ee
				$maxIndex = $j
			EndIf
		Next
		$aRes[$i] = $aVAF[$maxIndex]
		_ArrayDelete($aVAF,$maxIndex)
		$Nv -= 1
	Next
	Return $aRes
EndFunc

Func _fill($name)
	Local $mug[1] = [0]
	$file = FileOpen($name)
	While 1
		$str = FileReadLine($file)
		If @Error=-1 Then ExitLoop
		_ArrayAdd($mug, $str)
		$mug[0] += 1
	WEnd
	FileClose($file)
	Return($mug)
EndFunc

Func _drink($str1,$str2)
	$aStr1 = StringRegExp($str1,".*?(\d{3})",3)
	$aStr2 = StringRegExp($str2,".*?(\d{3})",3)
	Local $N1 = UBound($aStr1)-1, $N2 = UBound($aStr2)-1
	Local $index1 = 1, $index2 = 1
	Local $minPos = _Min(Number($aStr1[0]), Number($aStr2[0]))
	Local $maxPos = _Max(Number($aStr1[$N1]), Number($aStr2[$N2]))
	Local $estimate = 0

	For $i = $minPos to $maxPos
		While $aStr1[$index1] < $i
			$index1 += 1
			If $index1 > $N1 Then
				$index1 = $N1
				ExitLoop
			EndIf
		WEnd
		While $aStr2[$index2] < $i
			$index2 += 1
			If $index2 > $N2 Then
				$index2 = $N2
				ExitLoop
			EndIf
		WEnd
		If ($aStr1[$index1] = $i) And ($aStr2[$index2] = $i) Then $estimate += 1
	Next
	Return $estimate
EndFunc
 
Автор
V

vaf

Новичок
Сообщения
190
Репутация
2
C2H5OH сказал(а):
Раз других предложение не поступило, то берём критерий....
Огромное спасибо, скрипт очень выручил, как раз то что нужно, я не представляю как, но это работает. По какому принципу сделано ? Я честно говоря уже стал сомневаться что это возможно. Файл из 600 строк обрабатывал 5 минут. У меня файл 3500 строк, запущу обрабатывать на ночь.

А я уже хотел было отказываться от этих координат, а делать по другому.
наличие координаты обозначать "1", отсутствие "0". получилось бы что то типа
1.jpg;"11100011100"
2.jpg;"10010010101"
3.jpg;"10100011101"
4.jpg;"11001110111"
и потом уже сортировать по максимальному совпадению единиц.
 
Верх