Javascript.RU

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

Алгоритм поиска подстроки
function subStr(_substring, _string) {
	var substring = _substring.split(''),
		string = _string.split(''),
		found = false, k = 1;
	for(var i = 0; i < string.length; i++) {
		if(string[i] == substring[0]) {
			for(var j = 1, l = i + 1; j < substring.length; j++, l++) if (string[l]) {
				if(string[l] == substring[j]) {
					k++;
				} else {
					k = 1;
					break;
				}
			}
			if(k == substring.length) {
				found = true;
				break;
			} else {
				i = l;
			}				
		}
	}
	return found;
}


Можно ли сделать эффективнее? Интересует чисто с академической, так сказать, стороны
Ответить с цитированием
  #2 (permalink)  
Старый 20.08.2013, 00:09
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

а чем вам indexOf не угодил?

var string = 'qwe';
var substring = 'we';

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

devote,
ну про стандартные конструкции языка я в курсе, интересует именно со стороны эффективности алгоритма. Ну представим на минуту, что в javascript`e отсутствуют стандартные способы поиска подстроки и необходимо его реализовать.
Я вот тут ещё что подумал - к символу строки ведь можно обратиться по индексу, правильно ли я понимаю, что движок в этом случае при каждом подобном обращении преобразует строку к массиву? Целесообразно ли я в начале функции сам преобразовываю строки в массивы
Ответить с цитированием
  #4 (permalink)  
Старый 20.08.2013, 00:26
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от zilker
и необходимо его реализовать.
легко:
function strpos(substring, string) {
    return string.split(substring).length === 2;
}
alert(strpos('привет', 'привет мир!'));
вариант 2:
function strpos(substring, string) {
    var index = 0, subindex = 0;
    while(subindex < substring.length && index < string.length) {
        if (substring[subindex] === string[index]) {
           subindex++;
        } else {
           index -= subindex;
           subindex = 0;
        }
        index++;
    }
    return subindex > 0;
}
alert(strpos('привет', 'привет мир!'));
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine

Последний раз редактировалось devote, 20.08.2013 в 00:42.
Ответить с цитированием
  #5 (permalink)  
Старый 20.08.2013, 00:27
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Чет ты перемудрил.
function stringContains(string, substring) {
    if (substring.length === 0)
        return false;
    for (var i = 0; i < string.length; i++) {
        if (string[i] === substring[0]) {
            for (var j = 1; j < substring.length; j++) {
                if (string[i + j] !== substring[j])
                    return false;
            }
            return true;
        }
    }
    return false;
}

Может я тоже)
Ответить с цитированием
  #6 (permalink)  
Старый 20.08.2013, 00:30
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от danik.js
Чет ты перемудрил.
да вы оба мудрите странно))) без обид

P.S. конечно название я не совсем правильное функций сделал, но это сами придумывайте.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #7 (permalink)  
Старый 20.08.2013, 00:32
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

danik.js,
хотя не, у тебя тоже вполне компактно
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #8 (permalink)  
Старый 20.08.2013, 00:49
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Дзен-трансгуманист,
ну тогда релиз:
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 > 0;
}
alert(strpos('привет', 'привет мир!'));
частое обращение к свойству .length тоже влияет на производительность.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #9 (permalink)  
Старый 20.08.2013, 00:53
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Хром 28, разница чуть меньше: x8
Ответить с цитированием
  #10 (permalink)  
Старый 20.08.2013, 00:53
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

zilker,

function subStr(_substring, _string) {
   var found =  _string.split(_substring)[0].length
   return found  <  _string.length
}
alert(subStr('ty', 'qwerty'))
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Волновой алгоритм Ли с 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