Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 06.09.2017, 21:40
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 6,950

Nexus,
нет ничего подпадающее под разбор UTF, что вы уперлись в mb_?
Ответить с цитированием
  #22 (permalink)  
Старый 06.09.2017, 21:44
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 554

Сообщение от laimas Посмотреть сообщение
Nexus,
нет ничего подпадающее под разбор UTF, что вы уперлись в mb_?
Действительно (сарказм).
<?php

	function func(array $words,$length){
		$results=array();
		foreach($words as $string){
			if(strlen($string)<$length) 
				continue;
			
			$str=substr($string,0,$length);
			if(!isset($results[$str]))
				$results[$str]=array();
				
			$results[$str][]=$string;
		};
		
		return (array_map(function($vals){
			return array_unique($vals);
		},array_filter($results,function($vals){
			return count($vals)>1;
		})));
	};

	$string='Lorem Ipsum - это текст-"рыба", часто используемый в печати и вэб-дизайне. Lorem Ipsum является стандартной "рыбой" для текстов на латинице с начала XVI века. В то время некий безымянный печатник создал большую коллекцию размеров и форм шрифтов, используя Lorem Ipsum для распечатки образцов. Lorem Ipsum не только успешно пережил без заметных изменений пять веков, но и перешагнул в электронный дизайн. Его популяризации в новое время послужили публикация листов Letraset с образцами Lorem Ipsum в 60-х годах и, в более недавнее время, программы электронной вёрстки типа Aldus PageMaker, в шаблонах которых используется Lorem Ipsum.';
	
	$string=preg_replace('#\W+?#uim',',',strtolower($string));
	$string=array_filter(explode(',',$string));
	var_dump(func($string,5));
	exit;
Ответить с цитированием
  #23 (permalink)  
Старый 06.09.2017, 21:51
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 6,950

Sonya,
и array_filter тоже в таком случае не годится. Нет сейчас времени, а словами это так:

обычный цикл for, опрашивать сразу по два крайних элемента массива, двигаясь к центру массива

числа равные длине маски, это ключи, если такого нет, создаем и под ним помещаем элементы, у которых число начинается с этого ключа

в полученном массиве взять те, у которых вложения не пустые (или удалить такие)
Ответить с цитированием
  #24 (permalink)  
Старый 06.09.2017, 22:32
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 554

<?php
	header('Content-Type: text/html; charset=utf-8');
	ini_set('memory_limit','512M');
	
	function func(array $words,$length){
		if(count($words)%2==1)
			$words[]='';
		
		$words=array_values($words);
		$results=array();
		for($i=0,$j=count($words)-1;$i<$j;$i++,$j--){
			foreach(array($i,$j) as $key)
				if(strlen($words[$key])>=$length){
					$str=substr($words[$key],0,$length);
					$results[$str][]=$words[$key];
				};
		};
		
		return array_map(function($vals){
            return array_unique($vals);
        },array_filter($results,function($vals){
            return count($vals)>1;
        }));

	};

	$array=array();
	$i=1000000;
	while($i--)
		$array[]=mt_rand(0,mt_getrandmax());
		
	$start=microtime(true);
	$res=func($array,3);
	echo 'Найдено ',count($res),' результатов за ',number_format(microtime(true)-$start,3,'.',' '),' сек.';
	exit;

Последний раз редактировалось Nexus, 06.09.2017 в 22:38.
Ответить с цитированием
  #25 (permalink)  
Старый 06.09.2017, 22:33
Кандидат Javascript-наук
Отправить личное сообщение для Sonya Посмотреть профиль Найти все сообщения от Sonya
 
Регистрация: 07.07.2016
Сообщений: 121

Сообщение от Nexus Посмотреть сообщение
Sonya, или я очень устал, или вы действительно изъясняетесь так, что вас невозможно понять...

У вас есть:
1. файл, который содержит список чисел, разделенных запятыми;
2. длинна искомой строки.

Нужно:
Определить сколько слов имеет одинаковое начало и вернуть список этих слов.

Верно?

Код, что я привел зависает, если ему передать на обработку массив длинною в пол миллиона элементов?
Да.
Ответить с цитированием
  #26 (permalink)  
Старый 06.09.2017, 23:04
Кандидат Javascript-наук
Отправить личное сообщение для Sonya Посмотреть профиль Найти все сообщения от Sonya
 
Регистрация: 07.07.2016
Сообщений: 121

Только не слов, а цифровых кодов.
Ответить с цитированием
  #27 (permalink)  
Старый 11.09.2017, 04:23
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 6,950

$a = [
    1234576,
    2456901,
    1234598,
    2456776,
    2456993,
    1234567,
    1234555,
    3245089
];

$len = 4;

for($i = 0, $j = count($a)-1, $k = ceil(count($a)/2); $i < $k; $i++, $j--) {
    $group[substr($a[$i], 0, $len)][] = $a[$i];
    $group[substr($a[$j], 0, $len)][] = $a[$j];  
}

print_r($group);

print_r(array_values($group));
Ответить с цитированием
  #28 (permalink)  
Старый 16.09.2017, 10:13
Кандидат Javascript-наук
Отправить личное сообщение для Sonya Посмотреть профиль Найти все сообщения от Sonya
 
Регистрация: 07.07.2016
Сообщений: 121

Спасибо!
Ответить с цитированием
  #29 (permalink)  
Старый 16.09.2017, 12:48
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 6,950

Сообщение от Sonya
Спасибо!
Не за что. Я не знаю что за такой пакет этих цифр, но учтите, что если их количество в массиве будет не четным, то в результирующем массиве будет дубликат одного значения. Если нечетное число также ожидается, тогда нужно так:

$a = [
    1234579,
    2456901,
    1234598,
    2456776,
    2456993,
    1234567,
    1234555,
    3245089,
    1234778
];
 
$len = 4;

if(count($a) & 1) array_push($a, null); //дополнить массив до четного
 
for($i = 0, $j = count($a)-1, $k = count($a)/2; $i < $k; $i++, $j--) {
    $group[substr($a[$i], 0, $len)][] = $a[$i];
    if($a[$j]) $group[substr($a[$j], 0, $len)][] = $a[$j]; 
}
 
print_r($group);
 
print_r(array_values($group));

Последний раз редактировалось laimas, 16.09.2017 в 14:17.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление всех &nbsp; из текста (поиск и удаление любого слова из текста) Stenli jQuery 5 28.06.2017 19:47
Поиск слова по заглавной букве Vladislav306907 jQuery 7 25.04.2016 16:34
Поиск слова на странице (javascript) Корделия Элементы интерфейса 9 15.08.2013 16:44
Поиск слова в исходном коде html страницы klsorat2010 Ваши сайты и скрипты 1 20.05.2010 22:46
Поиск последнего слова в строке AlexFadeev Элементы интерфейса 3 01.04.2010 17:56