Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 20.08.2013, 00:57
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

devote,
function strpos(substring, string) {
    return string.split(substring).length === 2;
}
alert(strpos('привет', 'привет мир! привет'));
Ответить с цитированием
  #12 (permalink)  
Старый 20.08.2013, 01:03
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

рони,
у меня не совсем правильный вариант, нужно не равенство ставить, а больше одного.. так как вхождений подстроки может быть больше, что-то типо:
function strpos(substring, string) {
    return string.split(substring).length > 1;
}
alert(strpos('привет', 'привет мир! привет'));
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #13 (permalink)  
Старый 20.08.2013, 01:04
Аватар для zilker
Профессор
Отправить личное сообщение для zilker Посмотреть профиль Найти все сообщения от zilker
 
Регистрация: 30.07.2011
Сообщений: 189

danik.js,
твой код не найдет 'lala' в 'lal111lala', т.к. выдаст false после первого неудачного захода во вложенный цикл.
devote,
да, твой второй вариант более компактный, но он найдет 'lala' в 'lal'
Ответить с цитированием
  #14 (permalink)  
Старый 20.08.2013, 01:08
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от zilker
но он найдет 'lala' в 'lal'
исправимо, совсем небольшими правками:
function strpos(substring, string) {
    var index = 0, subindex = 0;
    var subStrLen = substring.length;
    var strLen = string.length;
    while(subindex < subStrLen && index < strLen) {
        if (substring.charCodeAt(subindex) === string.charCodeAt(index)) {
            subindex++;
        } else {
            index -= subindex;
            subindex = 0;
        }
        index++;
    }
    return subindex && subindex === subStrLen;
}
alert(strpos('привет', 'привет мир!'));
alert(strpos('lala', 'lal'));
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #15 (permalink)  
Старый 20.08.2013, 01:12
Аватар для zilker
Профессор
Отправить личное сообщение для zilker Посмотреть профиль Найти все сообщения от zilker
 
Регистрация: 30.07.2011
Сообщений: 189

Да, так работает как надо. Всем спасибо большое)

devote,
твой код в среднем в 10 раз быстрее моего первоначального...

но только из-за использования charCodeAt

Последний раз редактировалось zilker, 20.08.2013 в 01:26.
Ответить с цитированием
  #16 (permalink)  
Старый 20.08.2013, 01:41
Аватар для zilker
Профессор
Отправить личное сообщение для zilker Посмотреть профиль Найти все сообщения от zilker
 
Регистрация: 30.07.2011
Сообщений: 189

// моя фун-я
function subStr(substring, string) {
	var found = false, k = 1, sbl = substring.length, stl = string.length;
	for(var i = 0; i < stl; i++) {
		if(string.charCodeAt(i) == substring.charCodeAt(0)) {
			for(var j = 1, l = i + 1; j < sbl; j++, l++) if (string.charCodeAt(l)) {
				if(string.charCodeAt(l) == substring.charCodeAt(j)) {
					k++;
				} else {
					k = 1;
					break;
				}
			}
			if(k == sbl) {
				found = true;
				break;
			} else {
				i = l;
			}				
		}
	}
	return found;
}

// фун-я devote
function strpos(substring, string) {
    var index = 0, subindex = 0;
    var subStrLen = substring.length;
    var strLen = string.length;
    while(subindex < subStrLen && index < strLen) {
        if (substring.charCodeAt(subindex) === string.charCodeAt(index)) {
            subindex++;
        } else {
            index -= subindex;
            subindex = 0;
        }
        index++;
    }
    return subindex && subindex === subStrLen;
}


console.time('compare by char codes');
for (var i=0; i<100000; i++) strpos('друг', 'здравствуй, здравствуй, друг мордастый!');
console.timeEnd('compare by char codes');


console.time('compare by char codes2');
for (var j=0; j<100000; j++) subStr('друг', 'здравствуй, здравствуй, друг мордастый!');
console.timeEnd('compare by char codes2');


Хм, но если я применю оптимизацию с charCodeAt в своем коде, он начинает быть быстрее. Я не для пиписькомерства, просто интересно, у меня же вроде вложенный цикл есть
Ответить с цитированием
  #17 (permalink)  
Старый 20.08.2013, 10:38
Аватар для zilker
Профессор
Отправить личное сообщение для zilker Посмотреть профиль Найти все сообщения от zilker
 
Регистрация: 30.07.2011
Сообщений: 189

Дзен-трансгуманист,
спасибо за разъяснение.
Ответить с цитированием
  #18 (permalink)  
Старый 20.08.2013, 11:17
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Хотите оптимизации, ну тогда вот ловите.. Думаю ни для кого не секрет что вычитание работает в разы быстрее сложения.
function strpos(substring, string) {
    var substringStartPos = substring.length - 1;
    var subindex = substringStartPos;
    var index = string.length - 1;
    for( ;subindex >= 0 && index >= 0; ) {
        if (substring.charCodeAt(subindex) === string.charCodeAt(index)) {
            subindex--;
        } else if (subindex !== substringStartPos) {
            index += substringStartPos - subindex;
            subindex = substringStartPos;
        }
        index--;
    }
    return substringStartPos && subindex === -1;
}

console.time('compare by char codes');
for (var i=0; i<100000; i++) strpos('друг', 'здравствуй, здравствуй, друг мордастый!');
console.timeEnd('compare by char codes');
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Волновой алгоритм Ли с 8-ми направлениями boy_cow Общие вопросы Javascript 6 04.10.2012 21:08
Криво работает скрипт jQuery поиска в таблице dim565 jQuery 0 17.12.2011 21:23
Скрипт поиска по всем страницам сайта Mike1983 Firefox/Mozilla 2 13.05.2011 19:09
Автоматизация поиска Newbie_ Общие вопросы Javascript 4 20.12.2009 23:59
Форма поиска Владимир Новицкий Элементы интерфейса 4 21.01.2009 02:32