목록이 얼마나 정렬되어 있는지 측정할 수 있는 방법이 있습니까?
목록이 얼마나 정렬되어 있는지 측정할 수 있는 방법이 있습니까?
제 말은, 목록이 정렬되었는지 여부를 아는 것이 아니라, 통계의 상관 계수와 같은 "정렬성"의 비율과 같은 것입니다.
예를들면,
목록의 항목이 오름차순인 경우 해당 비율은 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
'programing' 카테고리의 다른 글
module.exports 내의 "local" 함수를 module.exports 내의 다른 함수에서 호출하시겠습니까? (0) | 2023.05.18 |
---|---|
__init__에서 wait와 함께 클래스 속성을 설정하는 방법 (0) | 2023.05.18 |
UI 레이블 텍스트 여백 (0) | 2023.05.18 |
배열에서 빈 요소를 제거하려면 어떻게 해야 합니까? (0) | 2023.05.18 |
관계형 데이터베이스에 계층 데이터를 저장하는 옵션은 무엇입니까? (0) | 2023.05.18 |