Подсчитайте, сколько раз подстрока встречается в строке внутри строки [duplicate]

В Win-Vector есть очень мощный новый пакет от ученых гениальных данных (люди, которые делали vtreat, seplyr и replyr), называемые cdata. Он реализует принципы «скоординированных данных», описанные в в этом документе , а также в этом сообщении в блоге . Идея заключается в том, что независимо от того, как вы организуете свои данные, должно быть возможно идентифицировать отдельные точки данных с помощью системы «координат данных». Вот отрывок из недавнего сообщения в блоге от John Mount:

Вся система основана на двух примитивах или операторах cdata :: moveValuesToRowsD () и cdata :: moveValuesToColumnsD (). Эти операторы имеют сводную, разворотную, однострочную кодировку, транспонирование, перемещение нескольких строк и столбцов и многие другие преобразования как простые частные случаи.

Легко написать много разных операций в терминах примитивов cdata. Эти операторы могут работать как в памяти, так и в больших масштабах данных (с базами данных и Apache Spark, для больших данных используются варианты cdata :: moveValuesToRowsN () и cdata :: moveValuesToColumnsN ()). Трансформации управляются таблицей управления, которая сама является диаграммой (или изображением) преобразования.

blockquote>

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

library(cdata)
# first build the control table
pivotControlTable <- buildPivotControlTableD(table = dat1, # reference to dataset
                        columnToTakeKeysFrom = 'numbers', # this will become column headers
                        columnToTakeValuesFrom = 'value', # this contains data
                        sep="_")                          # optional for making column names

# perform the move of data to columns
dat_wide <- moveValuesToColumnsD(tallTable =  dat1, # reference to dataset
                    keyColumns = c('name'),         # this(these) column(s) should stay untouched 
                    controlTable = pivotControlTable# control table above
                    ) 
dat_wide

#>         name  numbers_1  numbers_2  numbers_3  numbers_4
#> 1  firstName  0.3407997 -0.7033403 -0.3795377 -0.7460474
#> 2 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357

2
задан rossum 24 September 2011 в 17:53
поделиться

2 ответа

Поиск слова, которое чаще всего происходит в документе, может быть выполнено в O (n) с помощью простой гистограммы [hash based]:

histogram <- new map<String,int>
for each word in document: 
   if word in histogram:
      histogram[word] <- histogram[word] + 1
   else:
      histogram[word] <- 1
max <- 0
maxWord<- ""
for each word in histogram:
  if histogram[word] > max:
     max <- histogram[word]
     maxWord <- word
return maxWord

Это O (n), и поскольку проблема явно является проблемой Омега (n), она оптимальна в терминах большой записи O .

2
ответ дан amit 21 August 2018 в 01:40
поделиться
  • 1
    Во всяком случае, оптимальный ожидаемый. – Steve Jessop 24 September 2011 в 18:10
  • 2
    A trie вместо хеш-карты дает детерминированный O (n) наихудший случай, но на практике, вероятно, будет более медленным. – comco 30 January 2014 в 15:53
  1. Сканируйте документ один раз, подсчитывая, сколько раз вы видели каждое уникальное слово (возможно, используя хеш-таблицу или дерево для этого).
  2. Выполняя шаг 1, продолжайте трек слова, который имеет наибольшее количество всех слов, замеченных до сих пор.
2
ответ дан NPE 21 August 2018 в 01:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: