2010-07-18 6 views
4

Как получить индекс одного слова (представляет в массиве символов), который можно найти в абзаце (снова представляет в массиве символов).Java | сравнить char word в массиве char

полукокс представляет слово

char word[] = new char[]{'w','o','r','d'}; 

и вот этот пункт

char para[] = new char[]{'f','g','q','z','y','i','o','p','w','o','r','d'}; 

Я хотел бы получить индекс первой буквы в этом случае 8. Я использовал двоичный поиск, когда сортировка слов происходит скремблированием.

Спасибо.

+2

«Ожидая некоторой помощи». ok ... hehe – aioobe

+0

Как насчет простого символа char? –

+0

Каковы ограничения?Является ли производительность проблемой? Является ли ремонтопригодность кода проблемой? Является ли стоимость разработки проблемой? Это домашнее задание? Или вы просто спрашиваете из любопытства и на самом деле не планируете его реализовать? Ограничения на этот вопрос делают здесь ** огромную ** разницу. –

ответ

5

Немного неэффективна теоретически, а практически и просто:

int position = new String(paragraph).indexOf(new String(word)); 

Если вы хотите, чтобы понять, как это работает - проверьте static int indexOf(..) метод java.lang.String

+0

Если 'char []' не будет содержать тысячи символов, я не вижу проблем с этим. –

+0

Да, вот почему я сказал «теоретически». На практике этого будет достаточно. – Bozho

+0

Держу пари, что это будет на порядок быстрее, чем все, что он может реализовать. Единственная проблема в том, что String будет слишком большой для кучи. – quantumSoup

1

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

Если вы ищете лучший метод, см. http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.

+0

«Лучшее», вероятно, не было правильным словом; есть и другие, которые лучше работают в некоторых случаях. Но это наиболее часто используемый алгоритм. – user11977

2

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

Более сложным решением будет использование KMP algorithm.

+0

Да, предварительное условие сортированного массива для двоичного поиска полностью уничтожает информацию. Последовательность символов должна быть предварительно извлечена. –

+0

Я сам предпочитаю [Boyer-Moore] (http://en.wikipedia.org/wiki/Boyer-Moore_string_search_algorithm). KMP просто ... не интуитивно понятен. – quantumSoup

1

Вы можете преобразовать массивы символов в строки. Результат поиска в строке такой же, как если бы вы искали массивы.

String needle = new String(word); 
String haystack = new String(para); 
int i = haystack.indexOf(needle); 

Результат:

8 

Это может быть гораздо быстрее, чем наивным O (Н * м) поиска, так как функция строки indexOf оптимизирована.

Если вы хотите сделать это без создания временных строк, вы можете реализовать string searching algorithm для байтовых массивов. Например, вы можете выбрать алгоритм Boyer-Moore, который имеет наихудший случай O (n).

+0

Наивный алгоритм поиска - фактически O (n * m), но это немного похоже на домашнюю работу, поэтому он не сможет преобразовать его в String. – quantumSoup

+0

Просто интересно, к чему относится O (n^2)? Я никогда не видел этого в алгоритмике. –

+1

@Aircule: Спасибо, извините, что это была ошибка. @James P .: http://en.wikipedia.org/wiki/Big_O_notation –

0

Быстрый ответ, и я полагаю, другие будут более разрабатывать. Изначально, я хотел бы сделать что-то вроде этого (псевдокод лучше продумывать алгоритмы):

boolean nonmatchingchar 
integer i, j 
for each i of word until endof word 
    for each j of para until endof para 
     if word i isnotequalto para i set nonmatchingchar true  
    end for 
end for 


if nonmatchingchar is true print "character sequence not found" 

Edit: Для того, чтобы сделать это более эффективно в том случае, если вы хотите иметь несколько слов для поиска, вы могли бы стать двумерный массив со словами, отсортированными по их первой букве. Оттуда вы можете пройти вторую букву букв по букве и проверить подмножество слов в соответствии с этим письмом.

Смежные вопросы