파이썬 초보자 - 데이터 구조 - 검색 및 정렬

첫째을 찾습니다

순차 검색 :

목록의 첫 번째 항목에서 시작, 우리는 종류의 기본 순서를 따라, 단순히 다른 항목을 하나 개의 항목에서 이동, 우리는 당신이 항목을 찾을 때까지 찾고 또는 전체 목록을 통과하고 있습니다. 우리는 전체 목록을 통과하는 경우, 항목이 존재하지 않는 찾고있다. 목록의 N 오브젝트가 정렬되기 때문에, 복잡하므로 O (N)
이진 검색 :
정렬 된 목록을 위해, 우리는 직후, 중간 값 최소, 최소 및 대상 대상 최소, 최소의 다음보기 전에 다음 하위 목록보다 작은 경우 당신이 찾고있는 목표의 다음 비교를 결정하지 않을 경우 수 단어 목록을 찾아보십시오. 이 중간 지점을 찾기 위해 반복적으로 수행되기 때문에, 상정되는 i 번째의 N- / (2 경우되도록 목표를 찾는 찾을 수 해당 I O 임) = 1, 우리는 복잡성을 얻을 수있다 (logn)
해시 조회 :

해시 테이블은, 예를 들면, 0이라는, 항목을 길게하고, 0부터 정수 값으로 명명 할 수 일반적 슬롯이라 그 저장된 항목의 집합, 각 해시 테이블의 위치를 ​​쉽게 찾을 방법 슬롯라는 슬롯 1은 ......, 처음, 해시 테이블 항목을 포함하지 않는, 각 슬롯이 비어있는, 우리가 해시 테이블이 목록의 각 요소에 의해 초기화됩니다 달성 할 수 없음입니다. 해시 테이블의 홈에 속하는 항목 간의 매핑은 해시 함수라고 부른다. (m-1 ~ 0 사이)의 정수를 반환 해시 함수 범위의 컬렉션에서 어떤 항목 및 슬롯 이름을 허용

해시 기능 :

나머지 번호 : 단 하나 개의 테이블 항목 크기와 슬롯 이름의 범위에서 발생한다 해시 값 반환 잔여 부분과 같이 나누어 (H (아이템) = 상품 % 11 슬롯 (크기))에서

해시 값을 산출하면, 우리는 해시 테이블의 지정된 위치에 각 항목을 처리 할 수있다

항목이 범위에서 수용 할 수 있도록 주어진 아이템 세트가 각 항목은 고유 홈 완벽한 해시 함수에 매핑이 해시 함수라고 항상 완벽한 해시 함수를 가질 수있는 방법은, 해시 테이블의 크기를 증가시키는 것이다 각각의 가능한 값

많은 간단한 확장 나머지 방법 :

1 패킷 합산 방법

2 평방 取中 법

( 'C') == ORD : 3 등의 항목의 특성에 기초하여 해시 함수를 생성 (99 개)
의 특정 원리를 블로그 해시 룩업 : https://blog.csdn.net/weixin_41362649/article/details/81865829

슬롯은 컴퓨터 이름 해시 함수에 의해 계산되기 때문에, 다음 테이블 룩업을 해시 그 O 인 복잡성 (1)

둘째, 정렬 :

버블 :

두 목록을 비교 같은 경우, 더 큰 작은 항목의 뒷면에있는 항목, 그래서는 N-1 번을 비교리스트의 마지막 목적은 가장 큰 하나이며, 나머지 N- 다음 가장 큰 항목을 찾은 다음 마지막을 넣어 두 번째로,이 경우이므로,주기 n 번이 전체 목록은 증분 목록이 될 것입니다,하지만 당신은 그 복잡성은 O입니다 볼 수 있습니다 (N 2 ).

선택 :

선택 종류 직접 목록에서 가장 큰 항목을 찾을 버블 링에 최적화 한 다음 목록에서 마지막 위치에 배치하고 나머지 N-1은, 마지막으로 다음 두 번째 임기의 최대 용어를 찾아 남아있는 N-1 번째 기간에 대한 최대 기간을 찾은 다음, 마지막 넣어. 선택 정렬 버블 정렬 따라서 비교의 수가 동일하고 있음을 알 수있다 O (N- (2)  ). 그러나, 교환의 수의 감소로 인해, 종류는 일반적으로 빠른 실행을 선택합니다.

삽입 :

이 O은 여전히 비록 삽입 정렬은, (N- 형 2는 약간 다릅니다), 동작 모드. 항상 목록의 낮은 위치에 유지 하위 목록의 일종이다. 아이가 한 항목의 더 큰 정렬 된 목록이되도록 그런 다음 각각의 새로운 항목은 다시 이전의 하위 목록에 "삽입".

[1726547793]는 인서트 (31)가 서브 테이블이 순환 시프트에 의해 정렬 한 다음 순서리스트를 보유하기 위해, 비교의 최대 수는 삽입의 합 정렬 N-1의 정수, 동일이다 O (N- (2) ). 할당 회만 수행되므로 일반적으로, 시프트 연산, 교환 처리의 약 1/3는, 삽입 정렬 매우 우수한 성능을 갖는다.

힐 :

希尔排序(有时称为“递减递增排序”)通过将原始列表分解为多个较小的子列表来改进插入排序,每个子列表使用插入排序进行排序。 选择这些子列表的方式是希尔排序的关键。不是将列表拆分为连续项的子列表,希尔排序使用增量i(有时称为 gap ),通过选择 i 个项的所有项来创建子列表。
一个归纳的很好的博客https://www.cnblogs.com/ronnydm/p/5905715.html

归并:

归并过程为:比较a[i]和b[j]的大小,若a[i]≤b[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素b[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。

发现了一个C语言的关于归并的讲解https://www.cnblogs.com/Java3y/p/8631584.html,虽然语言不同,但是数据结构是一样的

快速:

快速排序通过在列表中随机确定一个参照值,进行跨越式比较,快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。

具体的话,在博客中很详细https://blog.csdn.net/adusts/article/details/80882649

추천

출처www.cnblogs.com/KangZP/p/11261115.html