저는 꽤 오랫동안 Go를 사용했기 때문에 몇 가지 고전적인 하위 수준 디자인 솔루션을 Go에 구현하는 것이 재미있는 도전이 될 것이라고 생각했습니다.
엘리베이터 시스템을 설계할 때 중요한 측면 중 하나는 특히 엘리베이터에 여러 요청이 있는 경우 다음 서비스 층을 결정하는 방법입니다. Go의 간단한 구문과 성능은 이러한 시스템을 모델링하는 데 이상적입니다. 그래서 저는 FCFS(First Come First Serve), SSTF(Shortest Seek Time First), SCAN 및 LOOK 알고리즘의 기본 구현을 만들기 시작했습니다.
1. 선착순 서비스(FCFS)
저는 가장 간단한 접근 방식인 서비스 요청을 받은 순서대로 시작했습니다. 구현하기는 쉽지만 요청이 여러 층에 분산되어 이동 시간이 늘어나면 비효율적일 수 있습니다.
func FCFS(currentFloor int, requests []int) []int { path := []int{} for _, floor := range requests { path = append(path, floor) } return path }
FCFS에서는 엘리베이터가 지정된 순서대로 요청한 층으로 이동합니다.
2. SSTF(최단 탐색 시간 우선)
SSTF는 다음으로 가장 가까운 요청 층을 선택하여 이동을 최소화하려고 합니다. 이렇게 하면 이동 시간이 줄어들지만 새로운 가까운 요청이 계속해서 오면 멀리 있는 요청에 대한 "기아"가 발생할 수 있습니다.
func SSTF(currentFloor int, requests []int) []int { path := []int{} remaining := append([]int{}, requests...) for len(remaining) > 0 { closestIdx := 0 minDistance := abs(currentFloor - remaining[0]) for i, floor := range remaining { distance := abs(currentFloor - floor) if distance <p>이 기능은 매번 현재 층과 가장 가까운 층을 찾아 이동 후 엘리베이터의 위치를 업데이트합니다.</p> <h2> 3. SCAN(엘리베이터 알고리즘) </h2> <p>SCAN에서는 엘리베이터가 한 방향으로 이동하여 끝에 도달할 때까지 해당 방향의 모든 요청을 처리한 다음 반대 방향으로 이동합니다. 이 접근 방식은 기아를 줄이기 때문에 SSTF보다 더 공정합니다.<br> </p> <pre class="brush:php;toolbar:false">func SCAN(currentFloor, maxFloor int, requests []int) []int { path := []int{} up := []int{} down := []int{} for _, floor := range requests { if floor >= currentFloor { up = append(up, floor) } else { down = append(down, floor) } } sort.Ints(up) sort.Sort(sort.Reverse(sort.IntSlice(down))) path = append(path, up...) path = append(path, down...) return path }
현재 위치보다 높은 층과 낮은 층으로 요청을 분할하는 기능입니다. 모든 층을 위쪽으로, 그 다음 아래쪽으로 서비스합니다.
4. 보세요
LOOK은 SCAN의 약간의 변형입니다. 엘리베이터는 끝까지 가는 대신 각 방향의 마지막 요청에 따라 방향을 바꿉니다. 물리적 한계가 아닌 요청이 끝나는 지점에서 중지하여 시간을 절약합니다.
func LOOK(currentFloor int, requests []int) []int { path := []int{} up := []int{} down := []int{} for _, floor := range requests { if floor >= currentFloor { up = append(up, floor) } else { down = append(down, floor) } } sort.Ints(up) sort.Sort(sort.Reverse(sort.IntSlice(down))) path = append(path, up...) path = append(path, down...) return path }
SCAN과 유사하게 이 접근 방식은 각 방향의 마지막 요청까지만 이동합니다.
각 알고리즘에는 장단점이 있습니다.
- FCFS: 간단하지만 비효율적일 수 있습니다.
- SSTF: 가장 가까운 층에 최적화되지만 멀리 있는 요청은 부족할 수 있습니다.
- 스캔: 공정하고 효율적이며 방향 변경을 최소화합니다.
- LOOK: 마지막 요청에서 중지하여 추가 시간을 절약합니다.
올바른 선택은 시스템의 효율성, 공정성, 응답 시간에 대한 구체적인 요구 사항에 따라 달라집니다.
LOOK 알고리즘을 사용하여 전체 구현을 보려면 내 github 저장소를 참조하세요.
thesaltree
/
로우레벨 디자인 골랑
Golang의 낮은 수준 시스템 설계 문제 솔루션
Go에서의 저수준 시스템 설계
Go의 하위 수준 시스템 설계 저장소에 오신 것을 환영합니다! 이 저장소에는 다양한 하위 수준 시스템 설계 문제와 Go로 구현된 솔루션이 포함되어 있습니다. 주요 목표는 실제 사례를 통해 시스템의 설계와 아키텍처를 보여주는 것입니다.
목차
- 개요
- 주차장 시스템
- 엘리베이터 시스템
개요
낮은 수준의 시스템 설계에는 시스템 아키텍처의 핵심 개념을 이해하고 확장 가능하고 유지 관리가 가능하며 효율적인 시스템을 설계하는 작업이 포함됩니다. 이 저장소에서는 Go를 사용하여 다양한 문제와 시나리오에 대한 솔루션을 다루려고 합니다.
주차장 시스템
이 저장소의 첫 번째 프로젝트는 주차장 시스템입니다. 이 시스템은 차량을 주차하고 주차 해제할 수 있는 주차장을 시뮬레이션합니다. 다음을 보여줍니다.
- 주차장 인스턴스 관리를 위한 싱글톤 디자인 패턴
- 다양한 유형의 차량(예: 승용차, 트럭)을 취급합니다.
- 다층에 걸쳐 주차공간을 관리합니다.
- 주차차량 결제 처리
특징
- 차량 추가 및 제거...
위 내용은 엘리베이터 스케줄링 알고리즘: FCFS, SSTF, SCAN 및 LOOK의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

GO 언어로 문자열 패키지를 마스터하면 텍스트 처리 기능과 개발 효율성이 향상 될 수 있습니다. 1) 함유 기능을 사용하여 하위 문자열을 확인하십시오. 2) 인덱스 기능을 사용하여 하위 문자열 위치를 찾으십시오. 빈 문자열을 확인하지 않고 큰 문자열 작동 성능 문제와 같은 일반적인 오류를 피하기 위해주의하십시오.

문자열 조작을 단순화하고 코드를보다 명확하고 효율적으로 만들 수 있기 때문에 이동중인 문자열 패키지에주의해야합니다. 1) strings.join을 사용하여 줄을 효율적으로 스플 라이스; 2) strings.fields를 사용하여 빈 문자로 문자열을 나눕니다. 3) 문자열을 통해 기판 위치를 찾으십시오. 4) 문자열을 대체하려면 strings.replaceall을 사용하십시오. 5) 현악기를 효율적으로 스플 라이스로 사용하여 strings.builder를 사용하십시오. 6) 예상치 못한 결과를 피하기 위해 항상 입력을 확인하십시오.

thestringspackageoisessentialponderfficientstringmanipulation.1) itofferssimpleyetpowerfultionsfortaskslikecheckingsubstringsandjoiningstrings.2) ithandlesunicodewell, withFunctionsLikestrings.fieldsforwhitespace-separatedValues.3) forperformance, st

whendecidingbetweengo'sbytespackageandstringspackage, usebytes.bufferforbinarydataandstrings.builderfortringoperations.1) audeBytes.bufferforworkingwhithbyteslices, binarydata, 첨부 DifferentDatatypes, andwritingtoio.2) useastrons

GO의 문자열 패키지는 다양한 문자열 조작 기능을 제공합니다. 1) 문자열을 사용하여 기판을 확인하십시오. 2) strings.split을 사용하여 문자열을 서브 스트링 슬라이스로 분할하십시오. 3) 문자열을 통해 문자열을 병합합니다. 4) 문자열의 시작과 끝에서 strings.trimspace 또는 strings.trim을 사용하여 공백 또는 지정된 문자를 제거하십시오. 5) 지정된 모든 하위 문구를 문자열로 교체하십시오. 6) strings.hasprefix 또는 strings.hassuffix를 사용하여 문자열의 접두사 또는 접미사를 확인하십시오.

Go Language Strings 패키지를 사용하면 코드 품질이 향상 될 수 있습니다. 1) strings.join ()을 사용하여 성능 오버 헤드를 피하기 위해 문자열 배열을 우아하게 연결하십시오. 2) strings.split () 및 strings.contains ()를 결합하여 텍스트를 처리하고 사례 민감도 문제에주의를 기울입니다. 3) 문자열의 남용을 피하고 ()을 replace ()하고 많은 수의 대체에 정규 표현식을 사용하는 것을 고려하십시오. 4) strings.builder를 사용하여 자주 스 플라이 싱 스트링의 성능을 향상시킵니다.

GO의 바이트 패키지는 바이트 슬라이싱을 처리하기위한 다양한 실용적인 기능을 제공합니다. 1. BYTES는 바이트 슬라이스에 특정 시퀀스가 포함되어 있는지 확인하는 데 사용됩니다. 2.Bytes.split은 바이트 슬라이스를 작은 피스로 분할하는 데 사용됩니다. 3.Bytes.join은 여러 바이트 슬라이스를 하나로 연결하는 데 사용됩니다. 4.bytes.trimspace는 바이트 슬라이스의 전면 및 후면 블랭크를 제거하는 데 사용됩니다. 5.Bytes.equal은 두 바이트 슬라이스가 동일인지 비교하는 데 사용됩니다. 6.bytes.index는 LargersLices에서 하위 슬라이스의 시작 지수를 찾는 데 사용됩니다.

Theencoding/BinaryPackageInsentialBecauseItProvideAstandAdizedWayStandwriteBinaryData, Cross-PlatformCompatibility 및 HandshandlingDifferentendianness.ItoffersFunctionsLikeRead, Write, andwriteUvarIntForPrecisControloverbinary


핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

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