2016-02-14 48 views
-1
(defun occurrences (l) 
(let (
     (result (mapcar #'(lambda (elt) (cons elt (count elt l))) 
      (remove-duplicates l) ) ) 
     (result2 nil) 
     (result3 nil) 
     (result4 nil) 
    ) 
(progn 
    (sort result #'> :key #'cdr) 
    (loop for x in result 
     do (and(push (car x) result2)(push (cdr x) result3)) 
    ) 
))) 

這應該按升序返回排序列表出現次數。除了重複最少次數的元素(與列表的其餘部分保持一致),不應返回。除非所有元素重複相同的次數,否則只有在這種情況下所有元素纔會返回。查找列表中出現次數最多的位置,並返回從最常出現的位置開始的列表

例如,

  1. (出現「(1 2 3))=>(1 2 3),#notice每個元素重複次數相同#。

  2. (occurrences'(1 1 3))=>(1)#因爲那裏1比列表中的任何其他元素出現得更頻繁。

3(出現 '(1 2 3 4 6 6 6 6))=>(6)

  • (出現'(1 1 3 3 0) )=>(1,3)。 #since(1 2),(3 2)和(0 1) 因爲元素1和3的出現次數仍高於此列表中至少一個元素的出現次數。
  • 注:現在此函數返回一個已排序列表中,但錯誤地返回最大值加元件,其發生,不在列表中的至少大於一個其它元件(OCC的數。)。例如, (發生'(7 7 7 1 2 3))返回(7 1 2 3),但應該只返回7.我真的很感謝一些幫助修復此函數返回期望值。

    回答

    2

    使用初始方法的溶液如下:

    (defun max-occurrences(l) 
        (let* ((occurrences (remove-duplicates 
             (mapcar #'(lambda (elt) (cons elt (count elt l))) l) 
             :test 'equal)) 
         (max-occurrence (reduce #'max occurrences :initial-value 0 :key #'cdr))) 
        (mapcar #'car (remove-if-not (lambda(x) (= x max-occurrence)) occurrences :key #'cdr)))) 
    

    然而,該方案的效率不高,因爲它具有的O成本(N )(在初始階段,每個將該列表的元素與所有其他元素進行比較以計算其頻率)。

    編輯

    更有效的解決辦法,例如通過使用一個哈希表來獲得(與改善建議由@uselpa評論):

    (defun max-occurrences(l) 
        (let* ((table (make-hash-table)) 
          (max-count (loop for elt in l maximize (incf (gethash elt table 0))))) 
        (loop for elt being the hash-key of table using (hash-value count) 
         when (= count max-count) collect elt))) 
    
    +0

    您可以保存一個通帶'((max-count(循環for elt in l maximize(incf(gethash elt table 0))))' – uselpa

    +0

    @uselpa,這是一個非常優雅的,謝謝!我已經更新了答案。 – Renzo

    +0

    謝謝您的幫助!您的解決方案令人印象深刻,並按預期工作... – user4557512

    相關問題