인덱스 바이너리

마지막 업데이트: 2022년 4월 13일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
    Find the minimum. Add a min() method to MaxPQ.java. Your implementation should use constant time and constant extra space.

[Solved] MindSpore 오류: StridedSlice 연산자는 Ascend 하드웨어에서 uint8 데이터 유형의 입력을 지원하지 않습니다.

훈련 스크립트는 StridedSlice의 단일 연산자 네트워크를 구성하고 단계 크기 및 인덱스에 따라 입력 Tensor에서 슬라이스를 추출하는 것입니다. 스크립트는 다음과 같습니다.

1.2.2 오류 보고

여기서 오류 메시지는 다음과 같습니다.

오류 메시지를 살펴보겠습니다. TypeError에서 연산자를 작성하십시오.[StridedSlice] input(UInt8) output(UInt8)은 지원되지 않습니다. 이 오류는 현재 입력 유형이 지원되지 않음을 의미합니다. 지원되는 유형에 대해서는 MindSpore 문서를 참조하십시오. 주로 StridedSlice 연산자의 경우 CPU에서 입력 및 uint 데이터 유형의 출력 유형은 현재 지원되지 않습니다. 해결책은 상승/gpu 플랫폼에서 실행되도록 전환하는 것입니다.

위에서 알려진 이유로 다음과 같이 쉽게 수정할 수 있습니다.

이 시점에서 실행이 성공하고 출력은 다음과 같습니다.

1. 오류를 보고한 사용자 코드 줄을 찾습니다. out = Net()(input_x, (1, 0, 2), (3, 1, 3), (1, 1, 1));

2. 로그 오류 메시지의 키워드에 따라 분석 문제의 범위를 좁힙니다. input(kNumberTypeUInt8) output(kNumberTypeUInt8)은 지원되지 않습니다.

인덱스 바이너리

오늘 다뤄 볼 주제는 바로 "이진 탐색(Binary Search) " 입니다.

높은 효율을 자랑하며 실제로 자주 쓰이는 알고리즘인데요, 과연 이진 탐색이라는 게 무엇인지 한번 알아봅시다!

- 이진 탐색(Binary Search)

: 이진 탐색이란, 정렬된 자료를 반으로 계속해서 나누어 탐색하는 방법입니다.

쉽게 말해, 아래와 같이 자료를 계속해서 반으로 쪼개서 찾는 것이죠.

[자료 1] 이진 탐색 (Binary Search)

감이 잘 안오신다구요? 백문이 불여일견! 바로 C로 작성된 코드로 보시겠습니다~

자, 우선 처음부터 차근 차근 분석해보죠.

인수로는 key, target, length 를 받고 있는데요, key 는 여기서 검색할 값, target 은 검색 대상이 있는 배열, length 는 배열의 길이입니다.

그 다음 함수 내의 첫 줄에서는 int형 변수 first 와 last, middle 을 선언한 뒤 각각 초기화 해주고 있습니다.

여기서 부터가 핵심인데요, first 와 last 는 처음에는 각각 배열의 첫 번째 index, 마지막 index를 가리키고 있습니다.

middle 은 중간에 있는 index를 가리키고 있구요.

그 뒤, while 반복문으로 first가 last 보다 작은 값인 동안 계속 아래 부분이 실행이 되도록합니다.

다음으로, 배열의 중간 값이 key 값과 일치하는 지 검사를 해서 만약 일치한다면 해당 값이 있는 주소를 return 합니다.

일치하지 않는다면, key값과 비교를 해서 key 값보다 중간 값이 클 경우, last 를 middle 보다 하나 작은 값으로 바꿔주고,

key값보다 중간 값이 작을 경우, first 를 middle 보다 하나 큰 값으로 바꿔줍니다.

그리고 마지막으로, middle 값을 first 와 last 의 중간 값으로 바꿔주죠.

설명으로 봐서는 '이게 무슨 말이지. ' 싶으실 테니 바로 그림으로 하나하나 다시 보도록 하겠습니다.

1. 첫 부분과 끝 부분을 가리키는 first 와 last, 중간 값을 가리키는 middle 을 초기화 합니다.

인덱스 바이너리

2. first가 last 보다 작거나 같은 지 검사합니다.

4-1. 찾고자 하는 값이라면, 해당 값이 있는 주소(target + middle)을 return 합니다.

4-2. 찾고자 하는 값이 아니라면, target[middle] 값이 찾고자 하는 값보다 큰지 비교합니다.

5-1. target[middle] > key 라면, last 의 값을 middle - 1로 변경합니다.

(찾고자 하는 값이 target[middle]보다 작다는 정보를 얻었으므로, middle 의 오른쪽 부분은 탐색할 필요가 없어졌습니다.)

(또한, middle - 1인 이유는 middle 에 위치한 값(target[middle])은

위에서 찾고자 하는 값과 일치하지 않는 다는 것을 알았기 때문이구요.)

(찾고자 하는 값이 target[middle]보다 크다는 정보를 얻었으므로, middle 의 왼쪽 부분은 탐색할 필요가 없어졌습니다.)

(또한, middle + 1인 이유는 middle 에 위치한 값(target[middle])은 인덱스 바이너리

위에서 찾고자 하는 값과 일치하지 않는 다는 것을 알았기 때문이구요.)

6. middle 의 값을 first 와 last 의 중간 값((first + last) / 2)으로 변경합니다.

7. 검색할 값을 찾을 때까지 위 과정을 반복합니다.

(first > last 가 되면 표현식의 값이 false가 되어 while 문을 벗어나게 되고, 해당하는 값이 없으므로 NULL을 return 합니다.)

단, 이진 탐색 알고리즘을 사용하실 때에 주의하실 점이 하나 있습니다.

앞에서 설명 드렸듯이, 반드시 '정렬'된 자료에만 사용하셔야 합니다.

어떤 정렬이냐구요? 여기서는 '오름차순' 으로 정렬되어 있어야 정상적으로 작동합니다.

그 이유는 위에 있는 C로 작성된 코드에 숨어 있습니다.

쉽게 이해하기 위해 한 가지 상황을 가정해봅시다. 만약 위 자료가 오름차순으로 정렬되어 있지 않다면 ?

가령 무작위로 배치 되어있다고 가정한다면, 위에서 5, 6번을 적용하는게 과연 옳은 것일까요?

자료가 무작위로 배치되어 있기 때문에 어느 특정 방향(앞 또는 뒤)으로 간다고 해서 해당 자료가 중간 부분보다 작거나 크다는 보장이 없습니다.

따라서, 찾고자 하는 데이터를 지나치는 경우(이진 탐색의 특성 상 전체의 반만 탐색하기 때문에 나머지 반은 버려지게 되죠)가 빈번하게 발생해 자료가 있음에도 불구하고 찾지 못하게 될 수 있습니다.

이제 이 주의 사항이 확 와닿으시죠?

그렇다면 슬슬 마지막 주제로 옮겨봅시다!

마지막 주제는 알고리즘하면 놓칠 수 없는 부분이죠! 바로 '시간 복잡도 분석(Analysis of Time Complexity)' 입니다.

간단히 유도를 해보겠습니다. 우선, 이진 탐색을 반복할수록 남아있는 (탐색할) 자료의 개수가 어떻게 될까요?

처음에 입력된 갯수를 N 이라하면,

첫 시행 후에는 반이 버려져서

두 번째 시행 후에는 또 그 반이 버려져서

새 번째 시행 후에는 또 그 반이 버려져서

규칙이 보이시나요? 그렇습니다. 매 시행마다 탐색할 자료의 개수가 점점 반씩 줄어드는 걸 알 수 있죠.

이렇게 계속해서 탐색을 반복하다보면 탐색이 끝나는 시점에는 (최악의 경우 즉, 찾는 데이터가 없는 경우) 남은 자료가 1개가 남게 되겠죠.

마지막으로 양 변에 2를 밑으로 하는 로그를 취해주면,

잠시, 그럼 여기서 K의 의미가 뭐였었죠? 그렇습니다 바로 시행 횟수였었죠.

즉, 자료의 갯수 N에 따른 시행 횟수는

, 따라서 시간 복잡도 는 Big O 표기법으로

(상수 부분은 무시하기 때문에 )

더 정확한 증명이 궁금하신 분들을 위해 좀 더 정확한 증명은 인덱스 바이너리 차후에 알고리즘 시간 복잡도 표기법에 관한 포스트 이후에 올리도록 하겠습니다.

인덱스 바이너리

Binary heap 에서는 부모의 key 는 자식의 key 보다 크거나 같다.

- delMax ( ) : 1 번과 N 번 key를 교환하고 1 번 위치의 key 를 sink ( ) 시켜서 적당한 위치에 오게한다. N 번위치에 있는 값을 반환하고 크기를 N - 1 로 줄인다.

  • Multiway heaps : binary tree 가 아닌 d-ary tree 구조를 사용한 PQ를 만들 수도 있다. 트리의 높이는 낮아지지만 자식 노드를 검색하는데 더 많은 시간이 걸린다.
  • Array resizing : PQ 의 자료를 담고있는 배열 크기의 변화에 따른 계산은 log N 정도다. (이전에 Stack 구현에서 사용했던 방법과 같다)
  • Immutability of keys : Binary heap 에 사용할 key 는 불변성을 가지는 자료여야한다. 클라이언트의 코드에 의해서 key 의 내용이 바뀔 수 있다면 예상하지 못한 결과를 초래할 수 있기 때문에 Immutable 한 key 를 사용해야 한다.
  • Index priority queue : 배열에 보관된 자료 또는 인덱싱해둔 자료일 경우 PQ 의 노드에 저장하는 값을 자료의 인덱스로 지정해서 사용하는 방법도 있다.

Practical considerations.

Exercises

  1. Suppose that the sequence

(where a letter means insert and an asterisk means remove the maximum) is applied to 인덱스 바이너리 an initially empty priority queue. Give the sequence of values returned by remove the maximum operations.

Solution. R R P O T Y I I U Q E U (E left on PQ)

Solution. Will need to update the maximum value from scratch after a remove-the-maximum operation.

  1. Provide priority queue implementations that support insert and remove the maximum, one for each of the following underlying data structures: unordered array, ordered array, unordered linked list, and ordered linked list. Give a table of the worst-case bounds for each operation for each of your four implementations from the previous exercise.
  1. Suppose that your application will have a huge number of insert operations, but only a few remove the maximum operations. Which priority-queue implementation do you think would be most effective: heap, unordered array, ordered array?

Answer. Unordered array. Insert is constant time.

  1. Suppose that your application will have a huge number of find the maximum operations, but a relatively small number of insert and remove the maximum operations. Which priority queue implementation do you think would be most effective: heap, unordered array, ordered array?

Answer. Ordered array. Find the maximum is constant time.

Partial answer: (a) 2.

  1. Design a linear-time certification algorithm to check whether an array pq[] is a min-oriented heap.

Solution. See the isMinHeap() method in MinPQ.java.

Solution. It suffices to prove that sink-based heap 인덱스 바이너리 construction uses fewer than n exchanges because the number of compares is at most twice the number of exchanges. For simplicity, assume that the binary heap is perfect (i.e., a binary tree in which every level is completed filled) and has height h.

Alternate heapify analysis

We define the height of a node in a tree to be the height of the subtree rooted at that node. A key at height k can be exchanged with at most k keys beneath it when it is sunk down. Since there are 인덱스 바이너리 2 hk nodes at height k, the total number of exchanges is at most:

Alternate heapify analysis

The first equality is for a nonstandard sum, but it is straightforward to verify that the formula holds via mathematical induction. The second equality holds because a perfect binary tree of height h has 2 h+1 − 1 nodes.

Proving that the result holds when the binary tree is not perfect requires a bit more care. You can do so using the fact that the number of nodes at height k in a binary heap on n nodes is at most ceil(n / 2 k+1 ).

Alternate solution. Again, for simplicity, assume that the binary heap is perfect (i.e., a binary tree in which every level is completed filled). We define the height of a node in a tree to be the height of the subtree rooted at that node.

Alternate heapify analysis

Creative Problems

  1. Computational number theory. Write a program CubeSum.java that prints out all integers of the form a 3 + b 3 where a and b are integers between 0 and N in sorted order, without using excessive space. That is, instead of computing an array of the N 2 sums and sorting them, build a minimum-oriented priority queue, initially containing (0 3 , 0, 0), (1 3 , 1, 0), (2 3 , 2, 0), . (N 3 , N, 0). Then, while the priority queue is nonempty, remove the smallest item (i 3 + j 3 , i, j), print it, and then, if j < N, insert the item (i 3 + (j+1) 3 , i, j+1). Use this program to find all distinct integers a, b, c, and d between 0 and 10^6 such that a 3 + b 3 = c 3 + d 3 , e.g., 1729 = 9^3 + 10^3 = 1^3 + 12^3.

    Find the minimum. Add a min() method to MaxPQ.java. Your implementation should use constant time and constant extra space.

Solution: add an extra instance variable that points to the minimum item. Update it after each call to insert(). Reset it to nullif the priority queue becomes empty.

Solution. Keep the median key in v; use a max-oriented heap for keys less than the key of v; use a min-oriented heap for keys greater than the key of v. To insert, add the new key into the appropriate heap, replace v with the key extracted from that heap.

Solution. This would yield an N log log N compare-based sorting algorithm (insert the N items, then repeatedly remove the minimum), violating the proposition of Section 2.3.

Web Exercises

  1. Best, average, and worst case of heapsort. What's are the best case, average case, and worst case number of compares for heapsorting an array of length N?

Solution. If we allow duplicates, the best case is linear time (N equal keys); if we disallow duplicates, the best case is ~ N lg N compares (but the best case input is nontrivial). The average and worst case number of compares is ~ 2 N lg N compares. See The Analysis of Heapsort for details.

Solution. Heapifying an array of N items in descending order requires 0 exchanges and N - 1 compares. Heapifying an array of N items in ascending order requires ~ N exchanges and ~ 인덱스 바이너리 2N compares.

Hint: Associate with each stack entry the minimum and maximum items currently on the stack.

Hint: do the previous exercise and simulate a queue with two stacks.

Solution: linear—the minimum key could be in any of the ceiling(N/2) leaf nodes.

Solution. Create a max-oriented binary heap and also store the minimum key inserted so far (which will never increase unless this heap becomes empty).

Solution: if the key in the node is greater than or equal to x, recursively search both the left subtree and the right subtree. Stop when the number of node explored is equal to k (the answer is yes) or there are no more nodes to explore (no).

Solution. Build a new min-oriented heap H'. We will not modify H. Insert the root of H into H' along with its heap index 1. Now, repeatedly delete the minimum item x in H' and insert into H' the two children of x from H. The kth item deleted from H' is the kth smallest item in H.

Solution: Use a complete binary tree with explicit links; assign the long integer priority i to the ith item added to the data structure.

Hint: Using a priority queue (similar to the taxicab problem), you can achieve an O(k log N) algorithm. Surprisingly, it is possible to do it in O(k) time but the algorithm is complicated.

Answer: the 인덱스 바이너리 인덱스 바이너리 number of compares is at most lg 1 + lg 2 + . + lg N = lg (N!) ~ N lg N.

Answer: use an information theoretic argument, ala 인덱스 바이너리 sorting lower bound. There are N! possible heaps (permutation of the N integers) on N distinct keys, but there are many heaps that correspond to the same ordering. For example, there are two heaps (c a b and c b a) that correspond to the 3 elements a < b < c. For a perfect heap (with N = 2^h - 1), there are A(h) = N! / prod((2^k-1)^(2^(h-k)), k=1..h) heaps corresponding to the N elements a[0] < a[1] < . < a[N-1]. (See Sloane sequence A056971.) Thus, any algorithm must be able to output one of P(h) = prod((2^k-1)^(2^(h-k)), k=1..h) possible answers. Using some fancy mathematics, you can argue that lg P(h) ~ 1.3644 N.

Note: The lower bound can be improved to ~ 3/2 N (Carlsson-Chen) using an adversary argument; the best-known algorithm for the problem takes ~ 1.625 N compares in the worst case (Gonnet and Munro).

Solution:1/15 and 1/36, respectively. Here is a nice discussion of the problem.

인덱스 바이너리

손상호 기자 | 2022-07-14 15:32:04

Facebook 공유

사회가 변화하면서 캐나다 가족의 유형도 점점 다양해지는 것으로 보인다 .

13 일 통계청이 2021 년 인구조사 ( 센서스 ) 자료를 토대로 발표한 보고서에 따르면 , 캐나다에서 혼자 사는 사람의 수는 역대 최대인 총 440 만 명으로 , 40 년 전인 1981 년에 비해 270 만 명이 증가한 것으로 드러났다 .

특히 혼자 사는 35~44 세 사이 성인의 비율은 1981 년 5% 에서 10% 로 두 배가량 증가했지만 , 남성과 여성의 기대수명이 점차 좁혀지면서 65 세 이상의 1 인 가구 비율은 감소하는 추세다 .

혼자 사는 인구가 증가하고 있음에도 캐나다의 1 인 가구 비율은 전체 가구의 29.3% 로 , G7 국가 중에는 미국 (28.5%) 을 제외하고는 가장 낮은 수준이었다 . 1 인 가구 비율이 가장 높은 G7 국가는 40.8% 를 기록한 독일이었다 .

캐나다 내 1 인 가구 비율은 지난 2016 년 약 28% 로 , 역사상 최초로 가장 많은 가정 유형이 됐다 . 그리고 2021 년 조사에서도 1 인 가구 (29.3%) 는 자녀가 없는 커플 가구 (25.6%), 자녀가 있는 커플 가구 (25.3%) 비율과 격차를 더욱 벌렸다 .

사실혼 커플의 수도 점차 증가하고 있다 . 전체 커플 중 사실혼 커플의 비율은 G7 국가 중 가장 높은 23% 로 , 지난 1981 년보다 무려 447% 가 증가했다 . 같은 기간 기혼 커플의 경우에는 26% 만 늘어나는 인덱스 바이너리 데 그쳤다 .

연령대가 어릴수록 사실혼 커플의 수가 많았는데 , 특히 20~24 세 커플의 79% 가 사실혼 관계인 것으로 조사됐다 . 퀘벡의 경우에는 전체 커플의 43% 가 사실혼 관계였다 .

룸메이트와 함께 거주하는 가정의 비율도 빠른 속도로 늘어나는 추세다 . 국내 룸메이트 가정은 전체 가정의 4% 였지만 , 이는 2001 년과 비교하면 54%, 2016 년에 비해서는 14% 가 늘어난 수준이었다 .

2021 년 센서스에서는 처음으로 동성 커플의 비율도 조사됐다 . 보고서에 따르면 전체 커플의 98.5% 가 남녀로 이루어졌지만 , 동성 커플의 비율은 1.1%, 트렌스젠더나 논바이너리 ( 남성도 여성도 아닌 성별 ) 가 포함된 커플은 0.4% 였다 .

인덱스 바이너리

최근에는 멀티 플랫폼을 지원하는 개발툴이 다양하게 존재한다. 물론 앱이 고도화되면 플랫폼별로 네이티브 개발을 하는게 제일 좋겠지만, 프로토타입을 개발하거나 MVP 버전의 앱을 개발하는 것은 멀티 플랫폼 툴이 아무래도 편한 것이 사실이다.

이번에 새로운 작업을 검토하면서 대세에 따라 Flutter를 활용해 보려고 야심차게 SDK 설치를 진행했다.
Flutter가 대세 중 대세라고 하지만 설정 과정은 역시나 구글스러워서 셋업중 예상치 못한 에러를 몇 개 만났다. 해결 방법을 정리해 본다.

Installation Process

[Android Studio 설치]

안드로이드 개발자라면 대부분 설치가 되어 있겠지만 없다면 안드로이드 개발 환경 설치가 필요하다. JDK나 에디터를 따로 설치해도 무방하지만 Android Studio는 Open JDK를 내장하고 있어서 안드로이드 개발환경이 쉽게 완료된다. 이 링크에서 다운받을 수 있다.

Flutter 설치는 간단하다. 스테이블 버전을 압축 파일로 받아 압출을 풀거나 Git에서 최신 버전을 당겨오는 것으로 Flutter의 설치는 사실상 완료된다. 한 가지 주의할 점은 압축을 푼 디렉토리가 Program Files 등 권한이 필요한 디렉토리가 아니어야 한다는 점이다. 윈도우향 Flutter는 이 링크에서 다운받을 수 있다.

Flutter 디렉토리 밑의 bin 디렉토리에 Flutter의 executable 및 배치 파일들이 들어있다. 해당 위치를 환경변수 path에 추가해 준다.

환경 변수가 설정되었다면 command 창 어느 위치에서나 flutter 커맨드를 실행 가능하다. 설치 확인을 위해 Flutter가 설치된 디렉토리로 이동해 다음 명령을 실행한다.

다음과 같이 모두 패스가 되면 환경이 완료된 것이다.

하지만 개발이 늘 그렇듯이, 게다가 오픈소스 개발 환경이 늘 그렇듯이 한 번에 되기가 어렵다.

Issues

분명 안드로이드 스튜디오가 설치되어 있는데 JDK를 못 인덱스 바이너리 찾는 경우 다음 에러가 나타난다.

해결 방법은 flutter config --android-studio-dir 명령으로 안드로이드 스튜디오 위치를 지정해 주는 것이다. 내 경우에는 디펄트 위치인 Program Files\Android\Android Studio에 설치가 되어 있어 다음과 같이 설정했다.

보통은 괜찮지만, 만약 안드로이드 SDK를 기본 위치가 아닌 다른 위치에 설치한 경우 다음 에러가 나타난다.

해결 방법은 flutter config --android-sdk 명령으로 안드로이드 SDK의 위치를 지정해 주는 것이다. 예를 들어, C:\SDK\adnroid_sdk에 설치가 되어 있다면 다음과 같이 설정한다.

[Android Licenses]

이제 다시 flutter doctor를 실행하면 이번엔 안드로이드 라이선스에 문제가 있단다.

해결 방법은 flutter doctor --android-licenses 명령을 통해 안드로이드 라이선스에 동의하는 것이다. 그런데 이게 또 에러가 난다.

Java에 익숙한 사람이라면 바로 눈치채겠지만 이건 200% JDK를 못찾는 경우이다. 분명 안드로이드 스튜디오 위치를 지정했는데 무슨 일인가 싶을텐데, 원인은 커맨드라인 툴이 없어서 그렇다.

안드로이드 스튜디오의 우상단에 위치한 메뉴바에서 SDK 매니저 버튼을 클릭해 SDK 매니저를 실행한다. (Tools->SDK Manager 메뉴를 선택해도 된다.)

그러면 다음의 화면이 나타난다.

  1. 왼쪽 트리 메뉴에서 Appearance & Behavior > System Settings >Android SDK 선택
  2. 우측에서 SDK Tools 선택
  3. 하단의 Hide Obsolete Packages 체크박스 해제
  4. Android SDK Command-line tools 선택
  5. Android SDK Tools (Obsolete) 선택
  6. Apply 버튼 클릭

이후 설치 과정을 진행하고 완료될 때까지 기다린다. 설치가 완료되면 다시 Command 창으로 돌아가 Flutter 설치 디렉토리에서 --android-licenses를 수행한다.

주루룩 나오는 라이선스에 y키를 눌러 하나 하나 동의해주면 라이선스 동의 과정이 완료된다. 이제 두근거리는 마음으로 다시 설치를 확인한다.

설치 상태가 체크되었고 이제 Flutter를 사용할 준비가 완료되었다. 사실 구글정도 되는 회사가 사람 몇 명 투입해서 간단한 GUI 몇 개 제공해주면 끝날 일인데 아쉽다는 생각을 해본다.


0 개 댓글

답장을 남겨주세요