代碼將測試數組是二維的將會是什麼?對於一個維度,我知道顛倒這個列表是可行的。對於二維,我知道相反的行/列必須相同。換句話說,[1] [2]必須等於[2] [1]等等。對稱2維陣列
(defun定義對稱檢查(名單)(等於列表(反向列表)))給你的例子
代碼將測試數組是二維的將會是什麼?對於一個維度,我知道顛倒這個列表是可行的。對於二維,我知道相反的行/列必須相同。換句話說,[1] [2]必須等於[2] [1]等等。對稱2維陣列
(defun定義對稱檢查(名單)(等於列表(反向列表)))給你的例子
這取決於您對稱的定義。
在線性代數,一個矩陣被稱爲對稱當且僅當它等於它的轉置(這相當於說M [I,J] = M [J,I]所有我和Ĵ)。因此,
(defun matrix-symmetric-p (m)
(equal m (transpose-matrix m)))
(defun transpose-matrix (m)
;; implement this
...)
我強烈建議使用實際的數組,因爲它會使這樣做更容易和更有效。所有執行使用列表列表的矩陣
(defun matrix-symmetric-p (m)
(loop for i from 0 below (array-dimension m 0)
always
(loop for j from 0 below (array-dimension m 1)
always
(= (aref m i j) (aref m j i)))))
然而,標題是模糊的,模擬可能會是這樣的:
(defun symmetric-2d-list-p (list)
(equal (reverse (mapcar #'reverse list)) list))
(symmetric-2d-list-p '((1 1 1) (2 2) (3) (2 2) (1 1 1))) ; T
(symmetric-2d-list-p '((2 1 2) (2 2) (3) (2 2) (2 1 2))) ; T
(symmetric-2d-list-p '((1 1 1) (2 2) (3 4) (2 2) (1 1 1))) ; NIL
但你真的想澄清,因爲二維數組是完全不同的東西,然後列表包含列表。
它當然可以是更好的答案,不需要創建額外的列表。因爲你最初的例子,我真的這樣做了。希望有人會發布更優化的版本。
首先是低效的,如果你需要隨機訪問,因爲這會使用二維數組成本O(n + m)
,而不是更便宜O(1)
。
要檢查對稱性,首先要確保矩陣是正方形,然後您只需檢查元素m_ij
等於所有對的元素m_ji
。
因爲需要檢查的對稱性是有意義的只考慮i > j
所有對避免做兩次,每次測試(>
而不是>=
因爲顯然m_ii
等於本身)。
作爲檢查對稱性的附加獎勵不需要考慮主對角元素。
(defun symmetric (m)
(let ((rows (array-dimension m 0))
(cols (array-dimension m 1)))
(when (= rows cols)
(dotimes (i rows T)
(dotimes (j i)
(unless (= (aref m i j) (aref m j i))
(return-from symmetric NIL)))))))
(let ((m (make-array (list 5 5) :initial-element 0)))
(dotimes (i 5)
(dotimes (j 5)
(setf (aref m i j) (* (1+ i) (1+ j)))))
(print m)
(print (symmetric m))
(setf (aref m 3 2) 9)
(print m)
(print (symmetric m)))
陣列:(SETF ARR(使陣列 '(2 2):初始內容'((1 2)(2 3)))) – Tequila 2012-02-12 16:53:42