2011-03-13 5 views
0

Я хочу написать функцию, которая добавляет элемент в список в правильном порядке, скажем 1 в [2, 3]. Я новичок в haskell и вам нужна помощь в том, как это сделать, не используя Ord.Добавление элемента в список

+2

Как вы узнаете, находится ли список в «правильном порядке» без «Орда» – kennytm

+1

Прежде чем вы начнете об этом, возможно, вам нужно быть более четким, чем вы хотите? Я полагаю, что 'louie 1 [2,3]' и 'louie 2 [1,3]' оба должны быть '[1,2,3]'. Но, например, что такое 'louie 1 [3,2]' или 'louie 2 [3,1]' или 'louie 6 [5,3,17,2]' должно быть? – applicative

ответ

1

Нетрудно написать функцию, которая вставляет элемент в отсортированный список. Это будет выглядеть примерно так:

insert :: Ord a => a -> [a] -> [a] 

insert x [] = [x] 

insert x (y:ys) 
    | x > y  = y : insert x ys 
    | otherwise = x : y : ys 

Однако это вряд ли будет эффективным для вашего случая использования. Проблема со списком заключается в том, что вы в конечном итоге создаете новую копию большой части позвоночника многократно с такой проблемой вставки. Вы также должны сканировать линейно по всему списку, пока не найдете нужное место, которое не является самым быстрым способом поиска правильного местоположения.

Возможно, вам будет лучше использовать структуру данных, такую ​​как таковая в Data.Set или Data.IntSet. Обычно это O (log n) для вставки, потому что они используют деревья или другие структуры данных, которые позволяют больше общего доступа, чем список, и быстро найти нужное место.

+0

Просто, чтобы быть ясным, для больших n (размер списка/набора) O (log n) значительно лучше, чем O (n), что вы получите, если используете список, который вы предлагаете. – chrisdb

+0

Должен ли я вернуть [a]? можете ли вы уточнить ответ? –

2

Ваш вопрос не имеет смысла, не используя Ord.

Использование Ord, функция, которую вы хотите, insert

Функция вставки принимает элемент и список и вставляет элемент в список на последней позиции, где еще меньше или равен следующим элемент.

+0

Перечисленный список приведен в порядке – Louie

+1

@Louie, тогда следующее предложение в документации применяется: «В частности, если список сортируется перед вызовом, результат также будет отсортирован». –

Смежные вопросы