Малонаселенный многомерный вектор в clojure? - PullRequest
4 голосов
/ 29 апреля 2011

Я пытаюсь создать малонаселенный многомерный вектор в Clojure, но я сталкиваюсь с ограничениями моих знаний.

У меня есть коллекция x Я перебираю и хочу создать многомерный вектор размером (count x) на (count x).Большинство ячеек будут пустыми, но в каждой точке, где совпадают оси x и y (например, (1 1), (2 2), (3 3) и т. Д.), Мне нужно запустить функцию, чтобы увидеть,значение должно быть помещено в это пространство.

На процедурном языке это было бы что-то вроде:

for (i = 0; i < length(x); i++) {
    for (j = 0; j < length(x); j++) {
        if (i == j && testReturnsTrue(x[i])) {
            table[i][j] = (list x[i])
        }
        else {
            table[i][j] = ()
        }
    }
}

Но я не могу обернуться, как это будет сделано в Clojure.Я пытался использовать вложенные для понимания и вложенные циклически повторяющиеся структуры, но я не могу заставить их работать.

Кроме того, я мог бы создать изменяемую таблицу с правильными размерами, инициализировать ее все для пустых списков, а затем установить значения при проверке каждого элемента в x, но я хотел бы сохранить таблицунеизменным, если это возможно.

Ответы [ 2 ]

11 голосов
/ 29 апреля 2011

Использовать хэш-карту?Нет необходимости в векторе, который не может быть редким.Кроме того, это императивное решение выглядит так, как будто оно не редкое - оно тратит память на хранение миллиардов пустых ячеек.Возможно, что-то вроде этого:

(let [indexed (map-indexed vector xs)]
  (reduce (fn [m [i x]]
            (if (test? x)
              (assoc-in m [i i] x)
              m))
          {}
          indexed))
4 голосов
/ 29 апреля 2011

Вложенный for с, как я бы это сделал:

(def x [:a :b :c :d])
(vec (for [i (range (count x))]
       (vec (for [j (range (count x))]
              (if (and (= i j) (identity (x i)))
                [(x i)]
                [])))))
=> [[[:a] [] [] []] [[] [:b] [] []] [[] [] [:c] []] [[] [] [] [:d]]]

(identity (x i)) является заменой для какого-либо теста.

РЕДАКТИРОВАТЬ: Как упоминалось в других ответах, если эта структура остается малонаселенной, лучшим выбором будет хеш-карта Я предполагал, что вы будете заполнять пустые части в последующих вычислениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...