목차
알고리즘 1: 재귀
算法二:尾递归
웹 프론트엔드 JS 튜토리얼 JS의 문자열 전체 배열 알고리즘과 메모리 오버플로에 대한 자세한 설명

JS의 문자열 전체 배열 알고리즘과 메모리 오버플로에 대한 자세한 설명

Feb 28, 2018 pm 01:27 PM
javascript 메모리

이 기사에서는 주로 JS의 문자열에 대한 전체 순열 알고리즘과 메모리 오버플로에 대한 자세한 설명을 공유합니다. 문자열이 주어지면 문자열에 있는 모든 문자 조합의 전체 순열을 찾습니다. 포함된 문자는 반복되지 않습니다.

输入:"abc"
输出:["abc","acb","bac","bca","cab","cba"]
로그인 후 복사

알고리즘을 구현할 때 문제가 발생했는데 여전히 해결할 수 없습니다. 하지만 전체 순열 알고리즘은 매우 중요하므로 이를 기록하기 위해 이 글을 썼습니다.

알고리즘 1: 재귀

알고리즘 아이디어:

  1. 문자열의 길이가 1이면 문자열을 출력하고,

  2. 길이가 1보다 크면 문자열의 첫 글자를 가져와서 다음을 찾습니다. length -1 문자열의 모든 순열, 각 순열의 임의 위치에 첫 번째 문자를 삽입합니다.

    알고리즘 구현:

function permutate(str) {
    //保存每一轮递归的排列结果
    var result = [];
    //初始条件:长度为1
    if (str.length == 1) {
        return [str]
    } else {
        //求剩余子串的全排列,对每个排列进行遍历
        var preResult = permutate(str.slice(1));
        for (var j = 0; j < preResult.length; j++) {
            for (var k = 0; k < preResult[j].length + 1; k++) {
                //将首字母插入k位置  
                var temp = preResult[j].slice(0, k) + str[0] + preResult[j].slice(k);
                result.push(temp);
            }
        }
        return result;
    }
}
로그인 후 복사

알고리즘은 이해하기 어렵지 않아야 합니다. 그러나 매개변수 문자열이 "abcdefghijkl"인 경우 정렬에 사용되는 공간은 12!=479001600이며 과도한 메모리 사용으로 인해 메모리 오버플로가 발생합니다. 자신의 PC에서 실행하는 경우 node --max-old-space-size=8192를 사용하여 메모리를 수정할 수 있습니다. 하지만 Codewars에서 실행해야 하므로 메모리를 수정할 수 없습니다. 그래서 내 생각은 꼬리 재귀 최적화를 사용하는 것이 었습니다. 하하, Node의 꼬리 재귀 최적화? 어쨌든 먼저 시도해 보겠습니다. "abcdefghijkl"时,排列用到的空间是12!=479001600,过大的内存占用导致内存溢出。如果你是在自己的PC上执行,那么可以使用node --max-old-space-size=8192来修改内存。但是我需要在Codewars上执行,所以无法修改内存。于是我想的办法是利用尾递归优化。呵呵,Node的尾递归优化?不管了,先试试吧。

算法二:尾递归

function permutate(str,result) {
    'use strict';
    let tempArr = [];
    //终止条件str长度为0
    if (str.length == 0) {
        return result
    } else {
        //第一次递归时,插入首字母
        if(result.length === 0){
            tempArr.push(str[0]);
        }else{
            for (let i = 0; i < result.length; i++) {
                let item = result[i];
                let itemLen = item.length;
                for (let j = 0; j < itemLen+1; j++) {
                    let temp = item.slice(0, j) + str[0] + item.slice(j);
                    tempArr.push(temp);
                }
            }
        }
        //递归截取了第一个字符的子串
        return permutate(str.slice(0),tempArr);
    }
}
permutate("abcdefghijkl",[]);
로그인 후 복사

函数的第一个参数是本次递归的字符串,第二个参数是前x个字符的全排列结果。
思路是:

  1. 每次取当次递归串的第一个字母;

  2. 若第二个参数长度为0说明是第一次递归,则初始化本次结果为[首字母]。然后将首字母从递归串中剔除,剩余串传给下一次递归;

  3. 之后每一次递归,都取递归串的首字母,将其插入前x个字符的全排列的所有位置,求出x+1个字符的全排列;

  4. 递归直到第一个参数为空串,则第二个参数为字符串所有字符的全排列。

    可能不太好理解,不过知道这是尾递归就行了。虽然尾递归在ES6的严格模式中才有效,但是,我加上'use strict';

    알고리즘 2: 꼬리 재귀
  5. function perm(str) {
        let result = [],tempArr = [];
        let subStr = str;
        while (subStr.length !== 0) {
            if (result.length === 0) {
                result.push(str[0]);
            } else {
                for (let i = 0; i < result.length; i++) {
                    let item = result[i];
                    let itemLen = item.length;
                    for (let j = 0; j < itemLen+1; j++) {
    
                        let temp = item.slice(0, j) + subStr[0] + item.slice(j);
                        tempArr.push(temp);
                    }
                }
                result = tempArr;
                tempArr = [];
            }
            subStr = subStr.slice(1);
        }
        return result;
    }
    로그인 후 복사
함수의 첫 번째 매개변수는 이 재귀의 문자열이고, 두 번째 매개변수는 첫 번째 x 문자의 전체 배열 결과입니다.
아이디어는 다음과 같습니다.

매번 현재 재귀 문자열의 첫 번째 문자를 가져옵니다.

두 번째 매개변수 길이가 0이면 첫 번째 재귀임을 의미하며 초기화 결과는 다음과 같습니다. code>[첫 글자]. 그런 다음 재귀 문자열에서 첫 번째 문자를 제거하고 나머지 문자열은 다음 재귀로 전달됩니다.

이후의 각 재귀에 대해 재귀 문자열의 첫 번째 문자를 가져와 첫 번째 x 문자의 모든 위치에 삽입합니다. x+1 문자의 전체 순열을 찾습니다.

첫 번째 매개변수가 빈 문자열이 될 때까지 반복되고 두 번째 매개변수는 문자열에 있는 모든 문자의 전체 순열입니다.

이해하기 쉽지 않을 수도 있지만 이것이 꼬리 재귀라는 점만 알아두세요. 꼬리 재귀는 ES6의 엄격 모드에서만 유효하지만 'use strict';를 추가한 후에도 여전히 작동하지 않습니다. 사실 함수 호출 스택의 오버플로가 아니라 변수를 저장하는 힙의 오버플로라고 생각합니다. 따라서 아마도 해결책이 없을 것입니다. 결국, 전체 배열이 무엇이든 공간 복잡도는 O(n!)입니다. 🎜🎜🎜🎜Algorithm 3: Loop🎜🎜마지막으로 루프에 대한 코드를 게시하겠습니다. 쓸모가 없으니 그냥 아이디어의 확장으로 사용하세요. 🎜rrreee🎜관련 권장사항: 🎜🎜🎜JS 전체 순열 및 조합 알고리즘 구현 방법🎜🎜🎜🎜JavaScript🎜🎜🎜🎜JavaScript의 여러 재귀적 전체 순열 알고리즘 예제에 대한 자세한 설명: 전체 순열 및 중복 제거🎜🎜

위 내용은 JS의 문자열 전체 배열 알고리즘과 메모리 오버플로에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 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 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

대용량 메모리 최적화, 컴퓨터가 16g/32g 메모리 속도로 업그레이드했는데 변화가 없다면 어떻게 해야 하나요? 대용량 메모리 최적화, 컴퓨터가 16g/32g 메모리 속도로 업그레이드했는데 변화가 없다면 어떻게 해야 하나요? Jun 18, 2024 pm 06:51 PM

기계식 하드 드라이브나 SATA 솔리드 스테이트 드라이브의 경우 소프트웨어 실행 속도의 증가를 느낄 수 있지만 NVME 하드 드라이브라면 느끼지 못할 수도 있습니다. 1. 레지스트리를 데스크탑으로 가져와 새 텍스트 문서를 생성하고, 다음 내용을 복사하여 붙여넣은 후 1.reg로 저장한 후 마우스 오른쪽 버튼을 클릭하여 병합하고 컴퓨터를 다시 시작합니다. WindowsRegistryEditorVersion5.00[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\MemoryManagement]"DisablePagingExecutive"=d

소식통에 따르면 삼성전자와 SK하이닉스는 2026년 이후 적층형 모바일 메모리를 상용화할 것으로 보인다. 소식통에 따르면 삼성전자와 SK하이닉스는 2026년 이후 적층형 모바일 메모리를 상용화할 것으로 보인다. Sep 03, 2024 pm 02:15 PM

3일 홈페이지 보도에 따르면 국내 언론 에트뉴스는 어제(현지시간) 삼성전자와 SK하이닉스의 'HBM형' 적층구조 모바일 메모리 제품이 2026년 이후 상용화될 것이라고 보도했다. 소식통에 따르면 두 한국 메모리 거대 기업은 적층형 모바일 메모리를 미래 수익의 중요한 원천으로 여기고 'HBM형 메모리'를 스마트폰, 태블릿, 노트북으로 확장해 엔드사이드 AI에 전력을 공급할 계획이라고 전했다. 이 사이트의 이전 보도에 따르면 삼성전자 제품은 LPWide I/O 메모리라고 하며 SK하이닉스는 이 기술을 VFO라고 부른다. 두 회사는 팬아웃 패키징과 수직 채널을 결합하는 것과 거의 동일한 기술 경로를 사용했습니다. 삼성전자 LPWide I/O 메모리의 비트폭은 512이다.

삼성전자가 HBM4 메모리에 널리 사용될 것으로 예상되는 16단 하이브리드 본딩 적층 공정 기술 검증을 완료했다고 밝혔다. 삼성전자가 HBM4 메모리에 널리 사용될 것으로 예상되는 16단 하이브리드 본딩 적층 공정 기술 검증을 완료했다고 밝혔다. Apr 07, 2024 pm 09:19 PM

보고서에 따르면 삼성전자 김대우 상무는 2024년 한국마이크로전자패키징학회 연차총회에서 삼성전자가 16단 하이브리드 본딩 HBM 메모리 기술 검증을 완료할 것이라고 밝혔다. 해당 기술은 기술검증을 통과한 것으로 알려졌다. 보고서는 이번 기술 검증이 향후 몇 년간 메모리 시장 발전의 초석을 마련하게 될 것이라고 밝혔다. 김대우 사장은 삼성전자가 하이브리드 본딩 기술을 바탕으로 16단 적층 HBM3 메모리를 성공적으로 제조했다고 밝혔다. ▲이미지 출처 디일렉, 아래와 동일 하이브리드 본딩은 DRAM 메모리층 사이에 범프를 추가할 필요 없이 상하층 구리를 직접 연결하는 방식이다.

Lexar, Ares Wings of War DDR5 7600 16GB x2 메모리 키트 출시: 하이닉스 A-다이 입자, 1,299위안 Lexar, Ares Wings of War DDR5 7600 16GB x2 메모리 키트 출시: 하이닉스 A-다이 입자, 1,299위안 May 07, 2024 am 08:13 AM

5월 6일 이 웹사이트의 소식에 따르면 Lexar는 Ares Wings of War 시리즈 DDR57600CL36 오버클럭 메모리를 출시했습니다. 16GBx2 세트는 5월 7일 0시에 예약 판매가 가능하며 가격은 50위안입니다. 1,299위안. Lexar Wings of War 메모리는 Hynix A-die 메모리 칩을 사용하고 Intel XMP3.0을 지원하며 다음 두 가지 오버클러킹 사전 설정을 제공합니다. 7600MT/s: CL36-46-46-961.4V8000MT/s: CL38-48-49 -1001.45V 방열 측면에서는 이 메모리 세트에는 1.8mm 두께의 올 알루미늄 방열 조끼가 장착되어 있으며 PMIC 독점 열 전도성 실리콘 그리스 패드가 장착되어 있습니다. 메모리는 8개의 고휘도 LED 비드를 사용하고 13개의 RGB 조명 모드를 지원합니다.

AI 물결의 영향은 분명합니다. TrendForce는 이번 분기에 DRAM 메모리 및 NAND 플래시 메모리 계약 가격 인상에 대한 예측을 수정했습니다. AI 물결의 영향은 분명합니다. TrendForce는 이번 분기에 DRAM 메모리 및 NAND 플래시 메모리 계약 가격 인상에 대한 예측을 수정했습니다. May 07, 2024 pm 09:58 PM

TrendForce 조사 보고서에 따르면 AI 물결은 DRAM 메모리와 NAND 플래시 메모리 시장에 상당한 영향을 미칩니다. 5월 7일 이 사이트의 뉴스에서 트렌드포스는 오늘 최신 연구 보고서에서 이번 분기에 두 가지 유형의 스토리지 제품에 대한 계약 가격 인상을 인상했다고 밝혔습니다. 구체적으로 트렌드포스는 당초 2024년 2분기 DRAM 메모리 계약 가격이 3~8% 인상될 것으로 추정했는데, 현재 NAND 플래시 메모리 기준으로는 13~18% 증가할 것으로 추정하고 있다. ~18%이고 새로운 추정치는 15% ~20%이며 eMMC/UFS만 10%의 더 낮은 증가율을 갖습니다. ▲이미지 출처 TrendForce TrendForce는 소속사가 당초 계속해서

Kingbang은 CAMM2, LPCAM2 및 일반 모델 중에서 선택할 수 있는 새로운 DDR5 8600 메모리를 출시했습니다. Kingbang은 CAMM2, LPCAM2 및 일반 모델 중에서 선택할 수 있는 새로운 DDR5 8600 메모리를 출시했습니다. Jun 08, 2024 pm 01:35 PM

6월 7일 이 사이트의 소식에 따르면 GEIL은 2024년 타이페이 국제 컴퓨터 쇼에서 최신 DDR5 솔루션을 출시했으며 선택할 수 있는 SO-DIMM, CUDIMM, CSODIMM, CAMM2 및 LPCAM2 버전을 제공했습니다. ▲사진출처: Wccftech 사진에서 볼 수 있듯이 진방이 전시한 CAMM2/LPCAMM2 메모리는 매우 컴팩트한 디자인을 채택해 최대 128GB의 용량과 최대 8533MT/s의 속도를 제공할 수 있다. 보조 냉각 없이 9000MT/s까지 오버클럭된 AMDAM5 플랫폼에서 안정적입니다. 보고서에 따르면 Jinbang의 2024 Polaris RGBDDR5 시리즈 메모리는 최대 8400을 제공할 수 있습니다.

win10에서 메모리를 쓸 수 없으면 어떻게 해야 하나요?_win10에서 메모리를 쓸 수 없는 문제를 해결하는 방법 win10에서 메모리를 쓸 수 없으면 어떻게 해야 하나요?_win10에서 메모리를 쓸 수 없는 문제를 해결하는 방법 Mar 25, 2024 am 11:01 AM

일부 사용자는 Win10을 사용할 때 "메모리를 쓸 수 없습니다"라는 메모리 오류 프롬프트를 경험했습니다. 무슨 일이 일어나고 있는 걸까요? 아래에서 편집기는 Windows 10 시스템 프롬프트 "메모리를 쓸 수 없습니다"에 대한 해결 방법을 공유합니다. win+r을 눌러 컴퓨터의 실행 기능을 열고 services 및 msc를 입력한 후 확인을 클릭합니다. 2. 서비스 창에서 Windows Management Instrumentation 서비스를 찾아 "중지"를 클릭한 다음 확인을 클릭합니다. 3. 여전히 win+r을 눌러 컴퓨터의 실행 기능을 열고 Enter를 누르세요.

PHP에서 int형을 문자열로 변환하는 방법에 대한 자세한 설명 PHP에서 int형을 문자열로 변환하는 방법에 대한 자세한 설명 Mar 26, 2024 am 11:45 AM

PHP에서 int 유형을 문자열로 변환하는 방법에 대한 자세한 설명 PHP 개발에서 int 유형을 문자열 유형으로 변환해야 하는 경우가 종종 있습니다. 이 변환은 다양한 방법으로 수행할 수 있습니다. 이 기사에서는 독자의 이해를 돕기 위해 특정 코드 예제와 함께 몇 가지 일반적인 방법을 자세히 소개합니다. 1. PHP 내장 함수 strval()을 사용하세요. PHP는 다양한 유형의 변수를 문자열 유형으로 변환할 수 있는 내장 함수 strval()을 제공합니다. int형을 string형으로 변환해야 할 때,

See all articles