Подскажите алгоритмик, или может excel умеет так делать
5280
8
Сэймэй
просветлённый
Доброго дня!
Есть задача:
имеется большой набор числовых данных, вот такого вида примерно:
1, 3, 5, 3, 3, 3, 7, 6, 3, 3, 3, 3, 8, 5, 2, 1, 3, 3, 3, 3, 3, 3, 2, 6, 7
и так далее, написал через запятую - но не суть важно, можно хоть через пробел, хоть столбиком, как угодно , данные в БД лежат
нужно в нем определять две вещи:
1. Как долго непрерывно продолжается последовательность цифры определенной, допустим "3".
2. Сколько раз за весь набор встречается последовательность из неменее чем 4-х цифр подряд, той же "3"
В данном примере мы видим что на первый вопрос ответ 6, а на второй вопрос ответ 2.
Но это видно визуально, а как бы это все по-быстрому посчитать.
Из подручных инструментов есть mysql в котором собственно и лежат данные, и excel )
Есть подозрение что в экселе может быть готовая функция которую можно поиспользовать - пока читаю описание статистических функций - не нашел.
Есть задача:
имеется большой набор числовых данных, вот такого вида примерно:
1, 3, 5, 3, 3, 3, 7, 6, 3, 3, 3, 3, 8, 5, 2, 1, 3, 3, 3, 3, 3, 3, 2, 6, 7
и так далее, написал через запятую - но не суть важно, можно хоть через пробел, хоть столбиком, как угодно , данные в БД лежат
нужно в нем определять две вещи:
1. Как долго непрерывно продолжается последовательность цифры определенной, допустим "3".
2. Сколько раз за весь набор встречается последовательность из неменее чем 4-х цифр подряд, той же "3"
В данном примере мы видим что на первый вопрос ответ 6, а на второй вопрос ответ 2.
Но это видно визуально, а как бы это все по-быстрому посчитать.
Из подручных инструментов есть mysql в котором собственно и лежат данные, и excel )
Есть подозрение что в экселе может быть готовая функция которую можно поиспользовать - пока читаю описание статистических функций - не нашел.
Каким образом в таблице mysql задается последовательность? есть еще поле id?
в БД лежат данные в виде:
ид_последовательности (таких последовательностей много, в каждой нужен анализ)
ид_цифры_в_последовательности (индекс, от 1 до 200 сейчас)
цифра_в_последовательности
ид_последовательности (таких последовательностей много, в каждой нужен анализ)
ид_цифры_в_последовательности (индекс, от 1 до 200 сейчас)
цифра_в_последовательности
на VBA в экселе 5 строчек программка занимает которая это посчитает
....где-то есть ошибочка, сорри... сейчас...
На SQL для MySQL не сумел сообразить. Там есть построчный перебор (типа курсоров MS SQL)?
На 5 строк, увы, моего дзена тоже не хватило. Здесь до craxx мне еще расти и расти.
Нижеприведенный текст сохраняете в виде файла с расширением .vbs и запускаете. Вполне можно прикрутить построчное чтение из файла (если строк много разных) или даже, возможно, напрямую из БД MySQL. Не очень изящно, но, как говорится, работает.
Запускать удобнее из консоли командочкой
где elem_count.vbs - имя сохраненного файла,
ну или просто двойным кликом из проводника.
На 5 строк, увы, моего дзена тоже не хватило. Здесь до craxx мне еще расти и расти.
Нижеприведенный текст сохраняете в виде файла с расширением .vbs и запускаете. Вполне можно прикрутить построчное чтение из файла (если строк много разных) или даже, возможно, напрямую из БД MySQL. Не очень изящно, но, как говорится, работает.
str = "1, 3, 5, 3, 3, 3, 7, 6, 3, 3, 3, 3, 8, 5, 2, 1, 3, 3, 3, 3, 3, 3, 2, 6, 7"
find_elem = "3"
elem = ""
prev_elem = "unreal-value"
cnt = 1
max_cnt = 0
four_cnt = 0
str = str + "," + prev_elem + ","
for i = 1 to Len(str)
ch = Mid(str, i, 1)
if (ch = ",") then
elem = Trim(elem)
if prev_elem = elem then
cnt = cnt + 1
else
if find_elem = prev_elem then
if max_cnt < cnt then max_cnt = cnt
if cnt >= 4 then four_cnt = four_cnt + 1
end if
cnt = 1
prev_elem = elem
end if
elem = ""
else
elem = elem + ch
end if
next
WScript.Echo "Наибольшая длина последовательности '",find_elem ,"' равна:", max_cnt
WScript.Echo "Количество групп '",find_elem ,"', с количеством не менее четырех в группе, равно:", four_cnt
Запускать удобнее из консоли командочкой
cscript elem_count.vbs //Nologo
где elem_count.vbs - имя сохраненного файла,
ну или просто двойным кликом из проводника.
в VBA разве нет split() который вернет массив из строки Split("42, 12, 19") ? (хотя от мс всего можно ожидать)
if (ch = ",") then
elem = Trim(elem)
И разбить на функции не мешало бы:
sequence = '1, 3, 5, 3, 3, 3, 7, 6, 3, 3, 3, 3, 8, 5, 2, 1, 3, 3, 3, 3, 3, 3, 2, 6, 7'.split(', ')
def count(sequence, needle):
tmp_occurence = 0
max_occurence = 0
for cur in sequence:
if int(cur) == needle:
tmp_occurence = tmp_occurence + 1
else:
if max_occurence < tmp_occurence:
max_occurence = tmp_occurence
tmp_occurence = 0
print 'Maximum occurence of %d is %d' % (needle, max_occurence)
def count_greater(sequence, greater, needle):
tmp_occurence = 0
amount = 0
for cur in sequence:
if int(cur) == needle:
tmp_occurence = tmp_occurence + 1
if tmp_occurence > greater:
amount = amount + 1
else:
tmp_occurence = 0
print 'Amount of suquences of %d greater than %d is %d' % (needle, greater, amount)
count(sequence, 3)
count_greater(sequence, 4, 3)
IEEE,
1) я исходил из того, что последовательность непробельных символов между запятыми может быть в том числе больше 1.
2) Я пробегаю по строке 1 раз, в вашей программе - два раза. Впрочем, это из разрада уже "померяться".
Лишь бы работало и удовлетворяло заданным потребностям.
Если есть split - все решается много проще, конечно, тут вы правы. Во всяком случае нагляднее и читабельнее. Но я язык этот плохо знаю.
1) я исходил из того, что последовательность непробельных символов между запятыми может быть в том числе больше 1.
2) Я пробегаю по строке 1 раз, в вашей программе - два раза. Впрочем, это из разрада уже "померяться".
Лишь бы работало и удовлетворяло заданным потребностям.
Если есть split - все решается много проще, конечно, тут вы правы. Во всяком случае нагляднее и читабельнее. Но я язык этот плохо знаю.