Re: Получить функцию
- From
- Вадим Зеленин ()
- To
- Dmitriy Gatsura
- Date
- 2002-11-14T12:03:31Z
- Area
- RU.ALGORITHMS
From: "Вадим Зеленин" <green@vista.spb.su>
Hello, Dmitriy!
You wrote in conference fido7.ru.algorithms to Vitaly Slobodskoy on Tue, 12
Nov 2002 22:31:00 +0300:
DG> Как поживаете, Vitaly ?
DG>>> Есть набор чисел 0,1,2..n из которого некоторым образом выбираются
DG>>> к чисел (к<=n). Существуют ли алгоритмы для вычисления ф-ции,
DG>>> которая бы проходила через все к точек?
VS>> Интерполяция, однако - интерполяционный многочлен Лагранжа.
DG> Если я правильно помню метод, то ф-ция проходящая через k точек
DG> будет представлять собой полином к-ой степени?
DG> Т.е. если имеем 1 00 000 точек то получим очень и очень не приятное
DG> выражение.
Дай-ка я тоже встряну :)
и напомню, что просто таблица точек - это тоже функция, только область
определения у неё диапазон целых чисел... поскольку ты не задал область
определения, может быть тебе подойдёт таблица? :)
И алгоритм приятный - int f(int x) { assert(0<=x&&x<k); return
(MyTable[x]); }
Говоришь, что нужна функция определённая на диапазоне действительных
значений? а чем плоха ступенчатая функция? не непрерывная? а где сказано,
что функция должна быть непрерывной? :)
Для непрерывных функций есть линейная интерполяция. Смотри-ка - экологически
чистая непрерывная функция построенная передовым методом линейной
интерполяции - и вычисляется просто и непрерывна :) У неё только производные
подкачали :) Но в исходной задаче нигде не говорится про непрерывность
производных... Кстати, есть способ представить такую функцию в виде суммы
f(x) := Sum(i:=1..k; c[i]*abs(X[i]-x)). Будет вполне как-бы аналитично.
Только по таблице считать быстрее :)
Далее - есть замечательные сплайны - будет и функция непрерывна, и первые
производные вполне :)
А интерполяционные полиномы должны знать своё место :) Типа служить только
для "гладких" данных и немногих точек. К сожалению, у них препоганое
поведение между точками, особенно если данные не "гладкие". Больно уж это
дорогое удовольствие - и через точки пройти и все производные непрерывные
:(. Особенный привет интерполяционному полиному в форме Лагранжа. Если
вычислять нужно много и быстро, лучше перейти к форме Ньютона. Кстати, и на
бумаге выглядит аккуратнее...
DG> А нет ли алгоритма способа нахождения некой хеш-функции которая бы
DG> описывала все эти точки и которую можно было бы запомнить или
DG> записать к примеру на бумаге(не слишком большом ее количестве)?
как-это, "хеш-функции которая бы описывала все эти точки"? Обычно
хеш-функции служат для отображения данных (ключей в б.д., идентификаторов в
компиляторах и пр.) в целые числа для ускорения поиска. Мы же ничего не
ищем? :))
DG> ЗЫ Мне кажется что таких методов просто не существует, но чем черт
DG> не шутит:)
Это ты, должно быть, шутишь ;)
Из исходной задачи я могу выделить две особенности данных - у тебя есть
такая табличка целых чисел, что:
1) Значения принадлежат интервалу [0, n].
2) Значения не повторяются.
Оба ограничения довольно слабы. Если отбросить второе (всё равно мы пока не
знаем как его применить; это гарантия того, что существует обратная функция,
но она нам сейчас не нужна...), то задача отыскания более компактной записи
чем таблица превращается в задачу написания архиватора :) При этом мы все
знаем, что для любого архиватора найдутся данные, которые в архиве займут
места больше, чем в исходном состоянии.
Удачи!
Вадим Зеленин. E-mail: green@vista.spb.su
--- ifmail v.2.15dev5
* Origin: Vista (2:5020/400)