복붙노트

[RUBY-ON-RAILS] 하나 개의 배열이 다른 배열의 모든 요소가 포함되어 있는지 확인하는 방법

RUBY-ON-RAILS

하나 개의 배열이 다른 배열의 모든 요소가 포함되어 있는지 확인하는 방법

주어진:

a1 = [5, 1, 6, 14, 2, 8]

나는 모든 요소가 포함되어 있는지 확인하고 싶습니다 :

a2 = [2, 6, 15]

이 경우에 그 결과는 거짓이다.

거기에있는 모든 내장 된 루비 / 같은 배열 포함을 식별하는 방법을 레일?

이를 구현하는 한 가지 방법은 다음과 같습니다

a2.index{ |x| !a1.include?(x) }.nil?

더 나은, 더 읽을 수있는 방법이 있나요?

해결법

  1. ==============================

    1.

    a = [5, 1, 6, 14, 2, 8]
    b = [2, 6, 15]
    
    a - b
    => [5, 1, 14, 8]
    
    b - a
    => [15]
    
    (b - a).empty?
    => false
    
  2. ==============================

    2.아마도 이것은 쉽게 읽을 수 있습니다 :

    아마도 이것은 쉽게 읽을 수 있습니다 :

    a2.all? { |e| a1.include?(e) }
    

    또한 배열 교차로를 사용할 수 있습니다 :

    (a1 & a2).size == a1.size
    

    참고 크기가 단지 속도를 여기에 사용되는, 당신은 또한 (느리게) 할 수 있습니다 :

    (a1 & a2) == a1
    

    하지만 가장 먼저 더 읽을 것 같아요. 이 3 일반 루비 (안 레일)입니다.

  3. ==============================

    3.이것은 수행하여 달성 될 수있다

    이것은 수행하여 달성 될 수있다

    (a2 & a1) == a2
    

    이는 A1 A2에도있는 모든 요소를 ​​반환 두 배열의 교차점을 생성한다. 결과는 A2와 같은 경우, 당신은 A1에 포함 된 모든 요소를 ​​확신 할 수 있습니다.

    A2의 모든 요소가 첫 번째 장소에서 서로 다른 경우이 방법은에만 작동합니다. 복식이있는 경우,이 방법은 실패합니다. 나는 진심으로 자신의 접근 방식을 권장 있도록 템포에서 하나 여전히 다음 작동 (또한 아마 더 빠르다).

  4. ==============================

    4.이 경우 중복 요소 없거나 그런 다음 설정 클래스를 사용할 수 있습니다, 그들에 대해 걱정하지 않는다 :

    이 경우 중복 요소 없거나 그런 다음 설정 클래스를 사용할 수 있습니다, 그들에 대해 걱정하지 않는다 :

    a1 = Set.new [5, 1, 6, 14, 2, 8]
    a2 = Set.new [2, 6, 15]
    a1.subset?(a2)
    => false
    

    장면이 사용 뒤에

    all? { |o| set.include?(o) }
    
  5. ==============================

    5.당신은 Array 클래스를 원숭이 패치 할 수 있습니다 :

    당신은 Array 클래스를 원숭이 패치 할 수 있습니다 :

    class Array
        def contains_all?(ary)
            ary.uniq.all? { |x| count(x) >= ary.count(x) }
        end
    end
    

    테스트

    irb(main):131:0> %w[a b c c].contains_all? %w[a b c]
    => true
    irb(main):132:0> %w[a b c c].contains_all? %w[a b c c]
    => true
    irb(main):133:0> %w[a b c c].contains_all? %w[a b c c c]
    => false
    irb(main):134:0> %w[a b c c].contains_all? %w[a]
    => true
    irb(main):135:0> %w[a b c c].contains_all? %w[x]
    => false
    irb(main):136:0> %w[a b c c].contains_all? %w[]
    => true
    irb(main):137:0> %w[a b c d].contains_all? %w[d c h]
    => false
    irb(main):138:0> %w[a b c d].contains_all? %w[d b c]
    => true
    

    물론 방법은 예를 들어, 표준 형 방법과 같이 쓸 수있다

    def contains_all?(a,b)
        b.uniq.all? { |x| a.count(x) >= b.count(x) }
    end
    

    그리고 당신처럼 호출 할 수 있습니다

    contains_all?(%w[a b c c], %w[c c c])
    

    실제로, 프로파일 링 한 후, 다음 버전은 훨씬 더 빨리, 그리고 코드가 짧습니다.

    def contains_all?(a,b)
        b.all? { |x| a.count(x) >= b.count(x) }
    end
    
  6. ==============================

    6.당신의 배열이 얼마나 큰에 따라 효율적인 알고리즘 O를 고려 (N N 로그) 수

    당신의 배열이 얼마나 큰에 따라 효율적인 알고리즘 O를 고려 (N N 로그) 수

    def equal_a(a1, a2)
      a1sorted = a1.sort
      a2sorted = a2.sort
      return false if a1.length != a2.length
      0.upto(a1.length - 1) do 
        |i| return false if a1sorted[i] != a2sorted[i]
      end
    end
    

    비용 O 정리 (N 로그 N)과 각각 쌍을 확인하면 O (n)을 비용은 따라서이 알고리즘 (N, N 로그) O이다. 다른 알고리즘은 정렬되지 않은 배열을 사용하여 빠른 (점근)이 될 수 없습니다.

  7. ==============================

    7.두 배열의 중복 요소가있는 경우 - (A2 A1) 또는 (A1 및 A2) 것하지 작업을 기반으로 대부분의 답변. 나는 단어 (배열 분할)의 모든 문자 (예 : 낙서 용) 문자 집합의 일부 있는지 확인하기 위해 방법을 찾고 여기에 도착했다. 이 답변 아무도 일하지, 그러나 이것은 수행합니다

    두 배열의 중복 요소가있는 경우 - (A2 A1) 또는 (A1 및 A2) 것하지 작업을 기반으로 대부분의 답변. 나는 단어 (배열 분할)의 모든 문자 (예 : 낙서 용) 문자 집합의 일부 있는지 확인하기 위해 방법을 찾고 여기에 도착했다. 이 답변 아무도 일하지, 그러나 이것은 수행합니다

    def contains_all?(a1, a2)
      try = a1.chars.all? do |letter|
        a1.count(letter) <= a2.count(letter)
      end
      return try
    end
    
  8. from https://stackoverflow.com/questions/7387937/how-to-determine-if-one-array-contains-all-elements-of-another-array by cc-by-sa and MIT license