programing

목록이 얼마나 정렬되어 있는지 측정할 수 있는 방법이 있습니까?

topblog 2023. 5. 18. 20:38
반응형

목록이 얼마나 정렬되어 있는지 측정할 수 있는 방법이 있습니까?

목록이 얼마나 정렬되어 있는지 측정할 수 있는 방법이 있습니까?

제 말은, 목록이 정렬되었는지 여부를 아는 것이 아니라, 통계의 상관 계수와 같은 "정렬성"의 비율과 같은 것입니다.

예를들면,

  • 목록의 항목이 오름차순인 경우 해당 비율은 1.0입니다.

  • 목록이 내림차순으로 정렬되면 비율은 -1.0이 됩니다.

  • 목록이 거의 오름차순으로 정렬되면 해당 비율은 0.9이거나 일부 값이 1에 가깝습니다.

  • 목록이 전혀 정렬되지 않은 경우(랜덤) 속도는 0에 가깝습니다.

저는 연습을 위해 스칼라에 있는 작은 도서관을 쓰고 있습니다.분류율이 유용할 것 같은데, 그런 정보가 없네요.아마도 나는 그 개념에 대한 적절한 용어를 알지 못할 것입니다.

목록의 반전 수를 간단히 셀 수 있습니다.

반전

일련의 유형 요소의 반전T 한 입니다.<의촬에서장의 에서.T

Wikipedia에서:

으로자, 정식.A(1), A(2), ..., A(n)n숫자들
한다면i < j그리고.A(i) > A(j)그 다음에 그 두 사람(i,j)반전이라고 합니다.A.

시퀀스의 반전 수는 정렬의 일반적인 척도 중 하나입니다.
식적으로, 반수반수, 즉전의전, 는공,

정의.

이러한 정의를 보다 명확하게 하기 위해 예제 시퀀스를 고려합니다.9, 5, 7, 6이 시퀀스는 반전이 있습니다. (0,1), (0,2), (0,3), (2,3)그리고 반전 번호. 4.

당신이 값원경을우는하 사이의 ,0그리고.1를 반전 번호 다로 수나 있습다 니눌으로 나눌 수 .N choose 2.

목록이 정렬되는 방식에 대해 이 점수를 계산하는 알고리즘을 실제로 만들려면 두 가지 방법이 있습니다.

접근법 1(결정론적)

즐겨찾기 정렬 알고리즘을 수정하여 실행되는 동안 수정 중인 반전 수를 추적할 수 있습니다.이것은 사소한 것이 아니며 선택한 정렬 알고리즘에 따라 구현이 다양하지만, 사용자가 시작한 정렬 알고리즘보다 더 비싸지 않은(복잡도 측면에서) 알고리즘을 사용하게 될 것입니다.

만약 당신이 이 길을 택한다면, 그것은 "스왑"을 세는 것만큼 간단하지 않다는 것을 명심하세요.를 들어,의 경우입니다.O(N log N)그러나 만약 그것이 내림차순으로 정렬된 목록에서 실행된다면, 그것은 모두를 수정할 것입니다.N choose 2반전그건.O(N^2)에서정 반전한정에서 입니다.O(N log N)작전따라서 일부 작업은 필연적으로 한 번에 둘 이상의 반전을 수정해야 합니다.구현 시 주의해야 합니다.참고: 복잡성을 가지고도 이 작업을 수행할 수 있습니다. 까다롭기만 합니다.

관련: 순열의 "반전" 수 계산

접근 2(확률적)

  • 쌍 덤 표 본 쌍(i,j)서, 디에어i != j
  • 쌍에 각 쌍 대 다 을 확 합 니 인 다 음 해 에 니 다 합 ▁whether ▁for 확 인 ▁determine , ▁pair 각list[min(i,j)] > list[max(i,j)](0 또는 1)
  • 이러한 비교의 평균 계산

저는 개인적으로 확률론적 접근법을 따를 것입니다. 만약 당신이 정확성에 대한 요구 사항을 가지고 있지 않다면 - 만약 그것이 구현하기 쉽기 때문입니다.


당신이 정말 원하는 것이 가치라면 (z'-1로 내려감)에서 (아래로)로 ~1(의 값상승), 수 z ) 에 있습니다.0및 (상승) 및1(아래로 내려감), 다음 공식을 사용하여 이 범위로 이동합니다.

z' = -2 * z + 1

목록(또는 다른 순차적 구조)이 정렬되는 방식에 대한 전통적인 측도는 반전의 수입니다.

는 a < bB 의수 a < b B B 쌍는 ( a, b ) , b) 입니다.<< 목적을 위해 이한목로으적러<<특정 정렬에 대해 선택한 순서 관계를 나타냅니다.

완전히 정렬된 목록에는 반전이 없고 완전히 반전된 목록에는 최대 반전 수가 있습니다.

실제 상관 관계를 사용할 수 있습니다.

정렬된 목록의 각 항목에 0부터 시작하는 정수 순위를 할당한다고 가정합니다.요소 위치 지수 대 순위의 그래프는 직선의 점처럼 보입니다(위치와 순위 간의 상관 관계 1.0).

이 데이터에 대한 상관 관계를 계산할 수 있습니다.역순 정렬의 경우 -1 등을 얻을 수 있습니다.

훌륭한 답변들이 있었고, 완성도를 위해 수학적 측면을 추가하고 싶습니다.

  • 정렬된 목록과 상관 관계가 있는 양을 측정하여 목록이 정렬된 정도를 측정할 수 있습니다.이를 위해 일반적인 상관 관계와 정확히 동일한 순위 상관(가장 잘 알려진 것은 Spearman's)을 사용할 수 있지만 항목의 아날로그 값 대신 리스트에 있는 요소의 순위를 사용합니다.

  • 상관 계수(정확한 정렬의 경우 +1, 정확한 반전의 경우 -1)와 같은 많은 확장이 존재합니다.

  • 이를 통해 랜덤 리스트에 대한 이 측정값의 분포를 알 수 있는 순열 중심 한계 정리와 같은 이 측정값에 대한 통계적 속성을 가질 수 있습니다.

반전 카운트 외에도 숫자 목록의 경우 정렬된 상태로부터의 평균 제곱 거리를 상상할 수 있습니다.

#! ruby
d = -> a { a.zip( a.sort ).map { |u, v| ( u - v ) ** 2 }.reduce( :+ ) ** 0.5 }

a = 8, 7, 3, 4, 10, 9, 6, 2, 5, 1
d.( a ) #=> 15.556
d.( a.sort ) #=> 0.0
d.( a.sort.reverse ) # => 18.166 is the worrst case

"최상의" 방법을 확신할 수 없지만 간단한 방법은 모든 요소를 그 이후의 요소와 비교하여 요소 2 > 요소 1(또는 테스트하려는 것이 무엇이든)인 경우 카운터를 증가시킨 다음 전체 요소 수로 나누는 것입니다.그것은 당신에게 퍼센티지를 줄 것입니다.

저는 비교를 세고 그것을 전체 비교 수로 나눕니다.다음은 간단한 Python 예제입니다.

my_list = [1,4,5,6,9,-1,5,3,55,11,12,13,14]

right_comparison_count = 0

for i in range(len(my_list)-1):
    if my_list[i] < my_list[i+1]: # Assume you want to it ascending order
        right_comparison_count += 1

if right_comparison_count == 0:
    result = -1
else:
    result = float(right_comparison_count) / float((len(my_list) - 1))

print result

이런 거 어때요?

#!/usr/bin/python3

def sign(x, y):
   if x < y:
      return 1
   elif x > y:
      return -1
   else:
      return 0

def mean(list_):
   return float(sum(list_)) / float(len(list_))

def main():
   list_ = [ 1, 2, 3, 4, 6, 5, 7, 8 ]
   signs = []
   # this zip is pairing up element 0, 1, then 1, 2, then 2, 3, etc...
   for elem1, elem2 in zip(list_[:-1], list_[1:]):
      signs.append(sign(elem1, elem2))

   # This should print 1 for a sorted list, -1 for a list that is in reverse order
   # and 0 for a run of the same numbers, like all 4's
   print(mean(signs))

main()

목록을 사용할 경우 해당 목록에 있는 값의 순위를 계산하고 순위 목록을 호출합니다.Y그리고 또 다른 리스트,X의 정수를 포함하는1로.length(Y)상관 계수를 계산하여 원하는 정렬의 측도를 정확하게 얻을 수 있습니다.r두 목록 사이에

r = \frac{\sum ^n _{i=1}(X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum ^n _{i=1}(X_i - \bar{X})^2} \sqrt{\sum ^n _{i=1}(Y_i - \bar{Y})^2}} 

전체 정렬된 목록의 경우r = 1.0역선택 목록의 경우,r=-1.0그리고r정렬 정도에 따라 이러한 한계 사이에 차이가 있습니다.

응용 프로그램에 따라 이 접근 방식에서 발생할 수 있는 문제는 목록의 각 항목의 순위를 계산하는 것이 정렬하는 것과 같으므로 O(n log n) 연산이라는 것입니다.

언급URL : https://stackoverflow.com/questions/16994668/is-there-a-way-to-measure-how-sorted-a-list-is

반응형