Как стать автором
Обновить

Комментарии 21

Входной массив предлагается разбить на B[123] и С[456].

Вы как-то всё время скачете голопом по европам, где же здесь алгоритм? Это эвристика, а не алгоритм,
1234567 как вы на б и ц будете разбивать?
5 пункт… э, то что вы написали… как бы помягче, для этого хватило бы и кода, мысль не понятна за руками слежу.
Да, Вы правы с 5 пунктом немного не додумал фразу. Подправил. Описание алгоритма сейчас должно почти точно отражать то, что сделано в коде.
Вот вопросы описания и восприятия меня и волнуют, поэтому спасибо, что уделили время и прочитали.
Вы не ответили, что мы будем делать с седьмым элементом, как разбивать?
Если Вы про начальную рабивку, то
$c=array_splice($a, $k);
$b=array_splice($a, 0, $k);
print_r($c);
print_r($b);


Array
(
[0] => 6
[1] => 7
)
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5

Если про то, речь о том, что индексы считаются с 0го, то в коде определено
j=k-1
Я вообще ничего не понял. Вы берёте от 0 до k и от k до конца?
То есть, если k=3 n=7, то это будет b[123] c[4567], а если n =100, то b[123] c [4..100]?
Да. А как можно понять по другому то, что я написал?
Какой смысл делить массив из чёртовой тучи элементов на 3+всё остальное? На мой взгляд, с таким же успехом можно и не делить.
Фактически можно не делить, а только печатать до К-элемента и хранить все в одном массиве, что с одной стороны сокращает код и приближает алгоритм к каноническим реализациям, с другой стороны хотелось закодировать ровно так, как это было выведено на бумаге.
Для чего? Для более четкого осознания все процесса. Просто, как я уже написал, сокращённый вариант может быть не таким очевидным. Но сокращение несколько иная задач, в конце можно просто придти к такому: на Си
Второй вариант
Почему у вас в описании 6 бьётся на 3+3, а в коде 7 бьётся на 5+2, а не 3+4 хотя бы.
Ну это просто пример, я же тоже игрался с числами
По моему, он просто тролль, расходимся.
Я не понял, кто тролль и Вам непонятно.
*и что вам непонятно
Все-таки это не совсем эвристика, так как начальное и, может быть, терминальное состояние могут закономерно выбиваться из общего алгоритма, но описать ведь их надо.
Естественно разбивка зависит от K
Естественно, разбивка зависит и от N
И от К и от N вдобавок, я если меняется значения K и N, то надо не забыть поменять и массив А
В хранит значения от 0 индекса и до K включительно

Я запутался в нумерации. Индекс отсчитывается от 0? Тогда, если К = 3, то почему в массиве В три элемента, а не четыре?
Потому что «array_splice() удаляет length элементов, расположенных на растоянии offset от начала массива ...».
Т.е. в начале берется столько элементов, сколько указано в K
А дальше, поскольку массив начинается с 1, а индексы считаются с 0, то
j=k-1
— )
В принципе можно сократить все до такого, убрав все splice внутри и убрав in_array, но очевидность относительно бумажного варианта немного теряется:
Заголовок
Код
 <?php
$a=array(1,2,3,4,5);
$k=3;
$n=5;
$c=array_splice($a, $k);
$b=array_splice($a, 0, $k);
$j=$k-1;
print_r($b);
 
        while (1) {
	   
       		$m=array_search($b[$j]+1,$c);
       	     if ($m!==false) {
	     	$c[$m]-=1; 
        	$b[$j]=$b[$j]+1;
               	print_r($b);	       
        }

       	if ($b[$k-1]==$n) {
	 $i=$k-1; 
	 while ($i >= 0) {

	 	if ($i == 0 && !in_array($b[$i]+1, $c)) break 2;
		
       		  $m=array_search($b[$i]+1,$c);
		  if ($m!==false) { 
		  	  $c[$m]=$c[$m]-1; 
			  $b[$i]=$b[$i]+1;
			
		 
			$g=$i;
		while ($g != $k-1) {
			array_unshift ($c, $b[$g+1]);
			$b[$g+1]=$b[$g]+1;
			$g++;
			}
			$c=array_diff($c,$b);
			print_r($b);
		 	     break;  
       			 }
	 	$i--;
	
		}
	
	}
	
             
}

?>


Согласен с основным (как я его понял) посылом статьи — для понимания работы алгоритма надо знать (прочитать, угадать) «замысел творца» — какая идея реализуется, какие инварианты соблюдаются и т.п. Так вот, все это можно описать в паре-тройке предложений в комментариях к коду — «комментируйте что а не как» (С) А саму реализацию уже надо делать краткой и оптимальной, а не рассусоливать и перегружать ненужными операциями, как в примерах статьи.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории