찾다
백엔드 개발파이썬 튜토리얼N의 K번째 인자 - O(sqrt n) 알고리즘

소개

최근에 저는 Big O 표기법을 한번에 배워보세요라는 글을 썼습니다. 해당 게시물에서는 Big-O 치트시트에서 사용할 수 있는 모든 유형의 Big O 시간 표기법을 살펴봅니다. 그리고 나는 그 7개 외에 더 이상 시간 표기가 가능하다고 생각하지 않았습니다.

우주 그 자체가 나를 낮추고 나의 무지함을 조롱하듯, O(√n)시간의 해결로 LeetCode 문제를 접하게 되었습니다. 미쳤다면 O(N^1/2)로 번역할 수 있습니다.

문제

두 개의 양의 정수 n과 k가 주어졌습니다. 정수 n의 인수는 n % i == 0인 정수 i로 정의됩니다.

오름차순으로 정렬된 n의 모든 요소 목록을 고려하고, 이 목록에서 k번째 요소를 반환하거나 n의 요소가 k보다 작으면 -1을 반환합니다.

확실한 해결책

글쎄, 당신이 나와 같다면 가장 먼저 생각한 것은 1부터 n까지의 모든 숫자를 살펴보고 그것이 인수인지 확인한 다음 원하는 k 인덱스에 있으면 반환하는 것이었습니다.

코드는 다음과 같습니다.

def getkthFactorOfN(n, k):
    result = 0
    for i in range(1, n + 1):
        if n % i == 0:
            result = result + 1
            if result == k:
                return i
    return -1

이거 다 괜찮고 멋있지만 "오직" O(n)이에요. 결국 루프는 하나뿐이고 n 1까지 올라갑니다.
시간 표기를 고려하면 다른 모든 작업은 무시됩니다.

하지만 친구여, 문제가 있어요.

요인 이해

생각해보면 특정 시점 이후에는 요소가 '미러링'됩니다.

예를 들어 숫자 81을 생각해 보세요. 인수는 [1, 3, 9, 27]입니다.

  • 1 * 81 = 81
  • 3 * 27 = 81
  • 9 * 9 = 81
  • 27 * 3 = 81
  • 81 * 1 = 81

숫자 9를 세지 않으면 단순히 연산이 반복되고 뒤집어집니다. n을 해당 인수 중 하나로 나누면 또 다른 인수가 나옵니다.
n의 제곱근은 제곱이 됩니다(duh).

이 지식을 바탕으로 이제 우리는 루프를 최대 n회(range(1, n 1) 사용)까지 반복할 필요가 없고 단지 math.sqrt(n)까지 반복할 필요가 있다는 것을 알게 되었습니다. 그러면 필요한 모든 요소가 확보됩니다!

그다지 명확하지 않은 해결책

이제 필요한 모든 것이 준비되었으므로 이 루프를 1 -> n에서 1로 -> sqrt n.

여기에 코드를 입력하고 한 줄씩 살펴보겠습니다.

def getkthFactorOfN(n, k):
    i = 1
    factors_asc = []
    factors_desc = []
    while i * i 



<p>아, 훨씬 더 복잡하네요. 분석해 보겠습니다.</p>

<p>먼저 i = 1로 초기화합니다. 이 변수는 요인 검색 시 "현재 위치"로 사용됩니다.</p>

<p>두 번째로, Factor_asc와 Factor_desc라는 두 개의 배열을 만듭니다. 여기서 마술은 Factor_asc에 요인을 추가한다는 것입니다. 요인은 자동으로 오름차순으로 정렬되기 때문에 이렇게 이름이 지정되었습니다.<br>
Factors_asc에 무엇인가를 추가할 때마다 n을 이것으로 나누어 Factor_desc에 추가합니다. 여기에도 비슷한 논리가 있습니다. 편리하게 내림차순으로 추가됩니다.</p><p>그런 다음 루프를 시작합니다. 여기서는 n의 루트에 도달하면 중지하므로 while i * i 

</p><p>현재 숫자가 인수(n % i == 0)인지 확인하는 것부터 시작합니다. 그렇다면 이를 Factor_asc 배열에 추가할 수 있습니다.</p>

<p>다음으로 i의 "역인수"를 구합니다. i != n // i, 즉 루트가 아닌지 확인하여 이를 수행할 수 있습니다. 이는 두 배열 모두에서 루트가 중복되어서는 안 되기 때문입니다. 그렇지 않은 경우 n // i를 실행하고 그 결과를 Factor_desc에 추가하여 반전된 인수를 얻습니다.</p>

<p>이후 i에 1을 더하고 루프를 계속합니다.</p>

<p>루프가 완료된 후에는 필요한 모든 계승이 있어야 합니다.</p>

<p>if k 

</p><p>그렇지 않다면 k에서 찾은 요소의 양을 빼고 k -= len(factors_asc) 및 k 

</p><p>k가 Factor_desc 내부에 있는 경우 Factor_desk[-k]를 사용하여 해당 값을 가져옵니다(마지막에서 처음으로).</p>

<p>모두 실패하면 -1을 반환합니다.</p>

<h2>
  
  
  곡선
</h2>

<p>곡선 그래프에서 그것이 어디에 있는지 궁금하다면 <strong>O(n)</strong>과 <strong>O(log n)</strong> 사이에 있을 것입니다. 전자보다 좋고 나쁨입니다. 후자보다. 그래프는 다음과 같습니다.</p>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173598658415895.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="The Kth factor of N - an O(sqrt n) algorithm"><br>
<em>Mathspace에서 사용 가능</em></p>

<h2>
  
  
  결론
</h2>

<p>이것은 발견하고 조사하는 여행이었습니다. 여기까지 읽어주셔서 정말 감사드립니다.</p>

<p>좀 더 최적화하려면 Factor_asc_len 및 Factor_desc_len 변수를 생성하고 이러한 배열에 값을 추가할 때마다 1을 추가하면 됩니다. 그러면 len() 메소드를 호출할 필요가 없습니다. <strong>O(n)</strong> 시간 표기에 영향을 미칠 수 있습니다.</p>

<p>다음 공부까지 행운을 빕니다!</p>


          

            
        

위 내용은 N의 K번째 인자 - O(sqrt n) 알고리즘의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
Linux 터미널에서 Python 버전을 볼 때 발생하는 권한 문제를 해결하는 방법은 무엇입니까?Linux 터미널에서 Python 버전을 볼 때 발생하는 권한 문제를 해결하는 방법은 무엇입니까?Apr 01, 2025 pm 05:09 PM

Linux 터미널에서 Python 버전을 보려고 할 때 Linux 터미널에서 Python 버전을 볼 때 권한 문제에 대한 솔루션 ... Python을 입력하십시오 ...

HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까?HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까?Mar 10, 2025 pm 06:54 PM

이 기사에서는 HTML을 구문 분석하기 위해 파이썬 라이브러리 인 아름다운 수프를 사용하는 방법을 설명합니다. 데이터 추출, 다양한 HTML 구조 및 오류 처리 및 대안 (SEL과 같은 Find (), find_all (), select () 및 get_text ()와 같은 일반적인 방법을 자세히 설명합니다.

파이썬 객체의 직렬화 및 사제화 : 1 부파이썬 객체의 직렬화 및 사제화 : 1 부Mar 08, 2025 am 09:39 AM

파이썬 객체의 직렬화 및 사막화는 사소한 프로그램의 주요 측면입니다. 무언가를 Python 파일에 저장하면 구성 파일을 읽거나 HTTP 요청에 응답하는 경우 객체 직렬화 및 사태화를 수행합니다. 어떤 의미에서, 직렬화와 사제화는 세계에서 가장 지루한 것들입니다. 이 모든 형식과 프로토콜에 대해 누가 걱정합니까? 일부 파이썬 객체를 지속하거나 스트리밍하여 나중에 완전히 검색하려고합니다. 이것은 세상을 개념적 차원에서 볼 수있는 좋은 방법입니다. 그러나 실제 수준에서 선택한 직렬화 체계, 형식 또는 프로토콜은 속도, 보안, 유지 보수 상태 및 프로그램의 기타 측면을 결정할 수 있습니다.

Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까?Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까?Mar 10, 2025 pm 06:52 PM

이 기사는 딥 러닝을 위해 텐서 플로와 Pytorch를 비교합니다. 데이터 준비, 모델 구축, 교육, 평가 및 배포와 관련된 단계에 대해 자세히 설명합니다. 프레임 워크, 특히 계산 포도와 관련하여 주요 차이점

파이썬의 수학 모듈 : 통계파이썬의 수학 모듈 : 통계Mar 09, 2025 am 11:40 AM

Python의 통계 모듈은 강력한 데이터 통계 분석 기능을 제공하여 생물 통계 및 비즈니스 분석과 같은 데이터의 전반적인 특성을 빠르게 이해할 수 있도록 도와줍니다. 데이터 포인트를 하나씩 보는 대신 평균 또는 분산과 같은 통계를보고 무시할 수있는 원래 데이터에서 트렌드와 기능을 발견하고 대형 데이터 세트를보다 쉽고 효과적으로 비교하십시오. 이 튜토리얼은 평균을 계산하고 데이터 세트의 분산 정도를 측정하는 방법을 설명합니다. 달리 명시되지 않는 한,이 모듈의 모든 함수는 단순히 평균을 합산하는 대신 평균 () 함수의 계산을 지원합니다. 부동 소수점 번호도 사용할 수 있습니다. 무작위로 가져옵니다 수입 통계 Fracti에서

아름다운 수프로 파이썬에서 웹 페이지를 긁어 내기 : 검색 및 DOM 수정아름다운 수프로 파이썬에서 웹 페이지를 긁어 내기 : 검색 및 DOM 수정Mar 08, 2025 am 10:36 AM

이 튜토리얼은 간단한 나무 탐색을 넘어서 DOM 조작에 중점을 둔 아름다운 수프에 대한 이전 소개를 바탕으로합니다. HTML 구조를 수정하기위한 효율적인 검색 방법과 기술을 탐색하겠습니다. 일반적인 DOM 검색 방법 중 하나는 EX입니다

Python으로 명령 줄 인터페이스 (CLI)를 만드는 방법은 무엇입니까?Python으로 명령 줄 인터페이스 (CLI)를 만드는 방법은 무엇입니까?Mar 10, 2025 pm 06:48 PM

이 기사는 Python 개발자가 CLIS (Command-Line Interfaces) 구축을 안내합니다. Typer, Click 및 Argparse와 같은 라이브러리를 사용하여 입력/출력 처리를 강조하고 CLI 유용성을 향상시키기 위해 사용자 친화적 인 디자인 패턴을 홍보하는 세부 정보.

인기있는 파이썬 라이브러리와 그 용도는 무엇입니까?인기있는 파이썬 라이브러리와 그 용도는 무엇입니까?Mar 21, 2025 pm 06:46 PM

이 기사는 Numpy, Pandas, Matplotlib, Scikit-Learn, Tensorflow, Django, Flask 및 요청과 같은 인기있는 Python 라이브러리에 대해 설명하고 과학 컴퓨팅, 데이터 분석, 시각화, 기계 학습, 웹 개발 및 H에서의 사용에 대해 자세히 설명합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구