массив с n элементами с отличием на 2

Статус
В этой теме нельзя размещать новые ответы.
Всегда готов признать свою ошибку и по поводу неравномерности я действительно погорячился. Ваш алгоритм решает поставленную задачу (Кстати, это к вопросу о понятности кода)

Хотите разбор, кода, извольте:

Циклов в Вашей программе 2 или foreach вы таковым не считаете? Его вполне можно заменить великолепной функцией implode

Излишний расход памяти - это использование функции explоde, которая по сути делает копию строки в памяти представляя ее содержимое в виде массива.

Неведомые манипуляции со знаком, как и определение переменной $shifft_key совершенно излишни, тот же самый результат вы получите используя начало каждого диапазона и его длину.

Зачем нужен массив $pos - он же нигде не используется. Здесь мы еще раз возвращаемся к ненужному расходу памяти.

array_splice($nl, $pos[$i], 0, $text_key); - зачем этот вызов? не проще ли добывить key к существующему элементу массива? Операции вставки в середину массива, как правило, очень дороги
$nl[$pos[$i]] .= " $text_key"; - в данном случае - это эквивалентная строка (с учетом дальнейшей обработки)

$key_pos=$key_pos+floor($col/$col_keys) - в каждой итерации цикла вы делаете одно и то же вычисление floor($col/$col_keys), лучше сделать это перед циклом, тем более что там вы вычисляете аналогичную величину. Это к вопросу неоптимальности.

В моем варианте 5 (значимых) строк и не одного комментария, но почему-то он кажется мне яснее. Возможно, это лишь дело вкуса.

Кстати, равномерность тексте не зависит от того, что Вы используете для определения размера каждого кусочка для вставки кея, слова или символы. Можете проверить на практике, или поверить мне на слово.
 
попробовал оба кода,

nittis, ваш скрипт работает хорошо, но когда кей ставится в самое начало - он заменяет букву!
KEY каждого любимое дело KEY своё. Понятия нормальности тоже KEY у каждого человека KEY сугубо индивидуальны не правда ли?
У каждого любимое дело своё. KEY Понятия нормальности тоже KEY у каждого человека KEY сугубо индивидуальны не правда KEY ли?

funman, ваш скрипт не может ставить кей в самое начало, + не понял где выставлять минимальный интервал от кея до кея
 
Всегда готов признать свою ошибку и по поводу неравномерности я действительно погорячился. Ваш алгоритм решает поставленную задачу (Кстати, это к вопросу о понятности кода)
Хотите разбор, кода, извольте:
Циклов в Вашей программе 2 или foreach вы таковым не считаете? Его вполне можно заменить великолепной функцией implode
Дело конечно вкуса, но implode то в любом случае перебирает все элементы массива, и что из них более ресурсо емкое я незнаю , думаю в таких масштабах это не принципиально.
Излишний расход памяти - это использование функции explоde, которая по сути делает копию строки в памяти представляя ее содержимое в виде массива.
У вас при посимвольной работе со строкой , строка по сути является одномерным массивом состоящим из символов, которая по сути также храниться в памяти, и стандартные ф-ции которые вы используете по сути также выполняют операции над массивом символов, точно также обращаясь в память…
Неведомые манипуляции со знаком, как и определение переменной $shifft_key совершенно излишни, тот же самый результат вы получите используя начало каждого диапазона и его длину.
Каким образом ? У меня $shifft_key равен половине расстояния между центрами кеев – 1 знак. И смена знака позволяет смещать от центра на 50% (-1 знак) .К примеру 15 слов, 3 кеея… соответственно расстояние 5 , плюс возможное отклонение от
-2 до 2, тоесть первый кей может быть на позиции 3,4,5,6,7. А что получиться если как вы предлагаете использовать начало каждого диапазона и его длину?
Зачем нужен массив $pos - он же нигде не используется. Здесь мы еще раз возвращаемся к ненужному расходу памяти.
Здесь согласен массив не нужен, сначала по другому хотел сделать.
Для оптимизации вообще можно три строки в одну поместить
PHP:
$k=(rand(0,$shifft_key)*$sight);        // Вычисляем коэф смещения
$pos[$i] = $key_pos + $k;               // Вычисляем позицию кея
array_splice($nl, $pos[$i], 0, $text_key); // Вставляем кей
на
PHP:
array_splice($nl, $key_pos + (rand(0,$shifft_key)*$sight), 0, $text_key)
array_splice($nl, $pos[$i], 0, $text_key); - зачем этот вызов? не проще ли добывить key к существующему элементу массива? Операции вставки в середину массива, как правило, очень дороги
$nl[$pos[$i]] .= " $text_key"; - в данном случае - это эквивалентная строка (с учетом дальнейшей обработки)
Простите а что произойдет с элементом на место которого мы вставим кей?? По сути мы его заменим кеем, а смысл??
$key_pos=$key_pos+floor($col/$col_keys) - в каждой итерации цикла вы делаете одно и то же вычисление floor($col/$col_keys), лучше сделать это перед циклом, тем более что там вы вычисляете аналогичную величину. Это к вопросу неоптимальности.
Согласен, в цикле не стоит каждый раз вычислять один и тот коэф.
В моем варианте 5 (значимых) строк и не одного комментария, но почему-то он кажется мне яснее. Возможно, это лишь дело вкуса.
Ну если брать значимые строки (не брать в расчет расчет статических коэф) то значимая строка то только одна , которая в нужную часть массива вставляет кей…
Кстати, равномерность тексте не зависит от того, что Вы используете для определения размера каждого кусочка для вставки кея, слова или символы. Можете проверить на практике, или поверить мне на слово.
На слово поверить могу, теоретически рассчитать не могу.
 
Странно, что скрипт попадает в нулевую позицию, должен бы с поиск с первого пробела начинать. Впрочем, поправить несложно.

PHP:
$content = substr_replace($content, " $key ", $pos, 1);

меняем на

PHP:
$content = substr_replace($content, " $key ", $pos, min(1, $pos));

при этом в начале строки появится ненужный пробел, который можно убрать с помощью функции trim

PHP:
$content = trim($content);

строку надо добавить после цикла

Добавлено через 22 минуты
Дело конечно вкуса, но implode то в любом случае перебирает все элементы массива, и что из них более ресурсо емкое я незнаю , думаю в таких масштабах это не принципиально.

Дело не столько в оптимальности, сколько в ясности кода. Если есть библиотечная функция ее ОБЯЗАТЕЛЬНО надо использовать. Не потому чт о она оптимальнее, а потому что так легче читать код. Исключения возможны, но очень редки.

У вас при посимвольной работе со строкой , строка по сути является одномерным массивом состоящим из символов, которая по сути также храниться в памяти, и стандартные ф-ции которые вы используете по сути также выполняют операции над массивом символов, точно также обращаясь в память…

Дело в том, что у вас получилось две копии одной строки (она сама и ее предстваление в массиве)

Каким образом ? У меня $shifft_key равен половине расстояния между центрами кеев ...

Если объяснять детально, то получится очень много текста. Посмотрите мой код, там реализован именно такой подход. Вы ищете центр диапазона и потом откладываете от него половину диапазона в ту или другую сторону. Тот же самый результат вы получите взяв начало диапазона и используя его полную длину.

Простите а что произойдет с элементом на место которого мы вставим кей?

Мы не вставляем, а добовляем к элементу пробел и кей. Точка перед знаком равенства - это не опечатка а знак конкатенации строк. Это существенно быстрее операции с массивом.

PHP:
$a = 'str';
$a .= ' key';
echo $a; // на экране будет выведено str key

Значимыми я посчитал те строки, в которых производятся хоть какие-то вычисления, то есть отбросил строки с инициализацией переменных. У меня их получилось чуть меньше, чем в Вашем варианте.
 
funman, ваш скрипт не может ставить кей в самое начало, + не понял где выставлять минимальный интервал от кея до кея

все он может ) просто нужно добавить одну строчку $key_pos=1; перед началом цикла, минимальное расстояние между кеями всегда два слова, определяется здесь $shifft_key = floor($key_pos/2)-1; (как работает уже объяснял), максимальное расстояние зависит от кол-во слов чтобы кеи равномерно распределялись...

вот оптимизированный вариант
PHP:
<?
// Исходные данные
$col_keys = "8";
$text_key = "<b>KEY</b>";
$s="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sit amet nibh. Viva mus non arcu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam dapibus, tellus ac ornare aliquam, consectetur adipiscing elit. id faEtiam dapibus, sit ame tellus a ucibus.
tristique urna, id faucibus lectus erat ut pede. Maecenas varius neque nec libero laoreet faucibus. id faEtiam dapibus, tellus a ucibus. Donec sit amet nibh. Viva mus non arcu. Lorem ipsum dolor sit amet, consectetur. Donec sit am et nibh. Viva mus arcu. Lorem ipsu";
// Преобразования массива
$nl = explode(" ", $s);
$col = count ($nl);
$key_pos = floor($col/$col_keys); $k2=$key_pos; $shifft_key = floor($key_pos/2)-1; $sight = 1; 

$key_pos=1;

for ($i = 1; $i <= $col_keys; $i++) {
    if (1 != rand(1, 2)) {$sight = $sight * -1;}
    if ($i == $col_keys) {$sight = -1;}
  
    array_splice($nl, $key_pos + (rand(0, $shifft_key) * $sight), 0, $text_key);
  
    $key_pos = $key_pos + $k2; 
}
// Ввыод готовых данных 
foreach ($nl as &$value) {echo " $value";}
?>
 
оба скрипта работают, авторам спасибо! вопрос снят :)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху