2012-02-12 74 views
3

代碼將測試數組是二維的將會是什麼?對於一個維度,我知道顛倒這個列表是可行的。對於二維,我知道相反的行/列必須相同。換句話說,[1] [2]必須等於[2] [1]等等。對稱2維陣列

(defun定義對稱檢查(名單)(等於列表(反向列表)))給你的例子

+0

陣列:(SETF ARR(使陣列 '(2 2):初始內容'((1 2)(2 3)))) – Tequila 2012-02-12 16:53:42

回答

2

這取決於您對稱的定義。

在線性代數,一個矩陣被稱爲對稱當且僅當它等於它的轉置(這相當於說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))))) 
+0

對於非正方形矩陣這個代碼將崩潰.. 。你也檢查每一對兩次。爲什麼使用'loop'即使它的語法實際上比lispier'dotimes'更冗長? – 6502 2012-02-12 09:19:55

+0

@ 6502是的,但是我使用的對稱性的定義對於非方矩陣無濟於事。 'dotimes'將需要使用'block'和'return-from'(注意我使用'always'指令),因此在語義上會有點醜陋。 – 2012-02-12 15:15:42

+0

我把「真正的數組」,通過我需要的測試,它的工作。謝謝, – Tequila 2012-02-12 17:17:55

1

然而,標題是模糊的,模擬可能會是這樣的:

(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 

但你真的想澄清,因爲二維數組是完全不同的東西,然後列表包含列表。

它當然可以是更好的答案,不需要創建額外的列表。因爲你最初的例子,我真的這樣做了。希望有人會發布更優化的版本。

3

首先是低效的,如果你需要隨機訪問,因爲這會使用二維數組成本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)))