Погода: 10 °C
19.048...11переменная облачность, небольшие дожди
20.041...8переменная облачность, без осадков
НГС.Форум /Компьютеры Интернет Связь / Программирование /

Подскажите алгоритмик, или может 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 сейчас)
    цифра_в_последовательности

    Орда - родная, злобная, твоя!

  • на VBA в экселе 5 строчек программка занимает которая это посчитает

    Осторожнее с травой!
    Если хапнешь много дряни
    Увезут тебя с собой
    Злые инопланетяне

  • ....где-то есть ошибочка, сорри... сейчас...

    Исправлено пользователем KSergey (31.08.12 12:44)

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

  • Спасибо, буду мучать! )

    Орда - родная, злобная, твоя!

  • В ответ на:

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

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

Записей на странице:

Перейти в форум

Модератор: