Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нарушения в очередности последовательности чисел 
:(
    Опции темы
valzy
Дата 5.4.2008, 21:09 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 6.3.2008

Репутация: нет
Всего: нет



Как искать нарушения в очередности последовательности чисел?
Последовательность чисел такая, что они принимают значения от 0 до 15, а потом снова с нуля.

Пример последовательности: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 12, 2, 13, 14, 15, 0, 1, 2.

Видно, что в последовательности числа 1 и 2 лишнии. Как идентифицировать подобное поведение и подсчитать ошибки в очередности? Буду рад выслушать идеи, или посмотреть готовые алгоритмы smile

Базовая последовательность конечна и все ее элементы принимают значения от 0 до 15 строго инкрементируя друг за другом ровно на единицу. "Лишние" элементы тоже принимают значения от 0 до 15, которые случайны.

Это сообщение отредактировал(а) valzy - 8.4.2008, 09:55
PM MAIL   Вверх
v2v
Дата 5.4.2008, 21:32 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



начинать с индекса i=0 , перехоим к i=1 .проверяем a[i]?=a[i-1] , если да идём дальше, если нет , начинаем выбрасывать числа из последовательности пока:  a[i]!=a[i-1]


--------------------
PM   Вверх
maxim1000
Дата 6.4.2008, 00:23 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



начать стоит со списка возможных искажений
на примере - вставка какого-то числа
какие-то ещё возможны? (замена, удаление, ...)

Это сообщение отредактировал(а) maxim1000 - 6.4.2008, 00:23


--------------------
qqq
PM WWW   Вверх
Akina
Дата 6.4.2008, 21:44 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(valzy @  5.4.2008,  22:09 Найти цитируемый пост)
Как идентифицировать подобное поведение и подсчитать ошибки в очередности? 

Известен ли предел "ошибки"? Есть ли гарантия непрерывности базовой последовательности?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
valzy
Дата 7.4.2008, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 6.3.2008

Репутация: нет
Всего: нет



Базовая последовательность конечна и все ее элементы принимают значения от 0 до 15 строго инкрементируя друг за другом ровно на единицу. "Лишние" элементы тоже принимают значения от 0 до 15, которые случайны.
PM MAIL   Вверх
Akina
Дата 7.4.2008, 08:16 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



В таком случае простейший алгоритм - для каждого значения искать следующее. Если оно и в ряду по положению следующее - в данной точке неправильности нет.

Но это полдела. Все найденные неправильности следует также проверить на принадлежность основной последовательности.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
FIaR
Дата 7.4.2008, 15:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.11.2006

Репутация: нет
Всего: 2



Вот исходник на С++ этого алгоритма

Код

#include <stdio.h>

// структура для хранения данных
struct nums {
    int        i;
    nums    *next;
}*root, *last;

// функция отвечающая за ввод данных с клавиатуры
// если введено число <0 или >15, то ввод закончен(и это число не добавляется в список)
int Input() {
    int x;
    scanf("%i", &x);
    if(x >= 0 && x <= 15) {
        nums *n = new nums;
        n = new nums;
        n->i = x;
        n->next = 0;
        if(root == 0) root = n;
        else last->next = n;
        last = n;
        return 1;
    }
    return 0;
}

// Функция для вывода на экран(числа не вписывающиеся в порядок выводятся в скобках)
int Print() {
    last = root;
    int i = last->i;
    int err = 0;
    while(true) {
        if(!err) printf("%i ", last->i);
        else printf("(%i) ", last->i);

        if(!(last = last->next)) break;

        if(i + 1 == last->i) {
            err = 0;
            i = last->i;
        }
        else {
            err = 1;
        }
    }
}

int main() {
    root = 0;
    while(Input());
    Print();
}


Так...до кучи ))

--------------------
Шуруп забитый молотком, держится лучше, чем гвоздь закрученый отверткой.  
PM MAIL   Вверх
valzy
  Дата 7.4.2008, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 6.3.2008

Репутация: нет
Всего: нет



Всем спасибо! Буду разбираться.
Еще возможен такой случай, что в последовательности группа элементов распологается впереди относительно другой группы элементов, которая должная была быть первой. Т.е:
3 4 5 6 7 8 9 0 1 2 10 11 12 13 14 15
Как здесь можно отловить нарушение в очередности? Сам даже и не знаю... 
P.S. А вообще этот алгоритм чем-то должен быть похожим на тот, в котором происходит поиск нарушений в очередности пакетов MPEG-2 Transport Stream и их потерь. Кто знает, тот поймет. Вот его бы не мешало посмотреть, т.к. в нем появилась острая необходимость.

Это сообщение отредактировал(а) valzy - 7.4.2008, 21:20
PM MAIL   Вверх
v2v
Дата 7.4.2008, 20:48 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



Цитата(valzy @  7.4.2008,  18:35 Найти цитируемый пост)

Еще возможен такой случай, что в последовательности группа елементов распологается впереди относительно другой группы элементов, которая должная была быть первой. Т.е:
3 4 5 6 7 8 9 0 1 2 10 11 12 13 14 15

а что в этом случае надо сделать ?  выбросить 0 1 2 или  поставить их на место перед 3 4 ...


--------------------
PM   Вверх
valzy
Дата 7.4.2008, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 6.3.2008

Репутация: нет
Всего: нет



Подсчитать количество таких нарушений. Переставлять нет нужды.
PM MAIL   Вверх
v2v
Дата 7.4.2008, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



ну так, все такие нарушения будут выявляться тем алгоритмом, что я описал в первом своём посте.
может непонятно написал...


--------------------
PM   Вверх
Akina
Дата 7.4.2008, 22:45 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(valzy @  7.4.2008,  19:35 Найти цитируемый пост)
Еще возможен такой случай

Я об этом уже говорил... 

Цитата(valzy @  7.4.2008,  19:35 Найти цитируемый пост)
3 4 5 6 7 8 9 0 1 2 10 11 12 13 14 15

Интересно, чем определено, что неправильность - это именно "0 1 2", а не всё остальное? Для меня это более чем неочевидно. Пока, во всяком случае... я уж не говорю о вариантах типа:
0 1 0 2 1 2 3 3 4 5 4 5 6 7 8 6 7 9 10 8 9 10 11 12 11 13 14 12 13 14 15 15
Ну-ка, покажите тут основную последовательность и "неправильности"  smile 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
v2v
Дата 7.4.2008, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



Цитата(Akina @  7.4.2008,  22:45 Найти цитируемый пост)

Ну-ка, покажите тут основную последовательность и "неправильности"

значит в таком случае выбрать начальную (самую длинную? ) правильную последовательность (возможно где то в средине она будет) и от неё отталкиваться.


--------------------
PM   Вверх
SoWa
Дата 8.4.2008, 06:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Утренние мысли:
1) от неправильности типа "повторения" можно избавиться путем слияния(выражаюсь некорректно) Пример. 15 15 15 15 15 -> 15 И где-нибудь отметим, что неправильность типа "повторение" исправлена
2) неправильность типа "пик или впадина". Идея графическая. Идти по графику и отыскивать в нем эти неправильности(некорректно выражаюсь). Так как мы ликвидировали неправильности типа "повторение", то можем смело делать так: если обнаруживаем, что слудующая точка после текущей рассматриваемой отличается от нее более чем на 1, то её принимаем во внимание за начало неправильности(вдруг неправильность вида 10 11 0 1 0 12). Идем далее по списку точек, пока не найдем ту, которая на 1 больше чем точка, с которой начался весь сыр бор.
Пример.
Код

10 11 0 1 0 12

Здесь точка 11 - текущая рассматриваемая. Точка 0 - начало неправильности. Далее смотрим каждую следующую точку, проверяем на условие, чтобы была на 1 больше чем 11. 1 не подходит. 0 не подходит. 12 подошла. Вставив в программе счетчик получим неправильность.


Ой ой. Начальную точку тоже как-нибудь проверяйте. Ноль или единица- вам решать.

Вот последовательность от Акины, приведеная в правильный вид. Красным - неправильности типа впадин, синим- типа повторений. Повторения превращаются в 1 число, как сказано в начале поста. Начало с 0.
0 1 0 2 1 2 3 3 4 5 4 5 6 7 8 6 7 9 10 8 9 10 11 12 11 13 14 12 13 14 15 15

0 1 0 2 1 2 3 3 4 5 4 5 6 7 8 6 7 9 10 8 9 10 11 12 11 13 14 12 13 14 15 15

Добавлено через 6 минут и 23 секунды
Прошу найти контр-пример, чтобы можно было думать дальше smile

Добавлено через 7 минут и 59 секунд
Цитата(Akina @  7.4.2008,  22:45 Найти цитируемый пост)
Интересно, чем определено, что неправильность - это именно "0 1 2", а не всё остальное? Для меня это более чем неочевидно. Пока, во всяком случае... я уж не говорю о вариантах типа:


Цитата(valzy)

Базовая последовательность конечна и все ее элементы принимают значения от 0 до 15 строго инкрементируя друг за другом ровно на единицу. "Лишние" элементы тоже принимают значения от 0 до 15, которые случайны.


Это сообщение отредактировал(а) SoWa - 8.4.2008, 06:22


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Akina
Дата 8.4.2008, 07:54 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(v2v @  8.4.2008,  00:19 Найти цитируемый пост)
значит в таком случае выбрать начальную (самую длинную? ) правильную последовательность (возможно где то в средине она будет) и от неё отталкиваться. 

Я не зря привел пример, где перемешаны две абсолютно одинаковые базовые последовательности.

Цитата(SoWa @  8.4.2008,  07:17 Найти цитируемый пост)
Красным - неправильности типа впадин, синим- типа повторений.

Неправильность типа "повторение" не оговорена. Единственный оговоренный тип неправильности - это когда 
Код

(x(n) + 1) mod 15 <> x(n+1)
(x(n) + 1) mod 15 <> x(n+2)
...
(x(n) + 1) mod 15 <> x(n+k-1)
(x(n) + 1) mod 15 = x(n+k)



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.