Подскажите алгоритмик, или может excel умеет так делать
5204
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 )
Есть подозрение что в экселе может быть готовая функция которую можно поиспользовать - пока читаю описание статистических функций - не нашел.
Сэймэй
Каким образом в таблице mysql задается последовательность? есть еще поле id?
KSergey
в БД лежат данные в виде:

ид_последовательности (таких последовательностей много, в каждой нужен анализ)
ид_цифры_в_последовательности (индекс, от 1 до 200 сейчас)
цифра_в_последовательности
Сэймэй
на VBA в экселе 5 строчек программка занимает которая это посчитает
Сэймэй
....где-то есть ошибочка, сорри... сейчас...
KSergey
На SQL для MySQL не сумел сообразить. Там есть построчный перебор (типа курсоров MS SQL)?

На 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 - имя сохраненного файла,
ну или просто двойным кликом из проводника.
KSergey
Спасибо, буду мучать! )
KSergey

if (ch = ",") then
elem = Trim(elem)
в VBA разве нет split() который вернет массив из строки Split("42, 12, 19") ? (хотя от мс всего можно ожидать)

И разбить на функции не мешало бы:


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
IEEE,
1) я исходил из того, что последовательность непробельных символов между запятыми может быть в том числе больше 1.
2) Я пробегаю по строке 1 раз, в вашей программе - два раза. Впрочем, это из разрада уже "померяться".

Лишь бы работало и удовлетворяло заданным потребностям.
Если есть split - все решается много проще, конечно, тут вы правы. Во всяком случае нагляднее и читабельнее. Но я язык этот плохо знаю.