내가 이것을 먼저 썼는 이유에 대해 이야기합시다. 인터뷰에 갔을 때, 나는 인터뷰 전날 11시에 알리바바의 지정된 인터뷰 도시에 갔다 다음 날 인터뷰의 열악한 결과를 직접 이끌어 냈습니다 (직업을 찾고있는 큰 새우들은 새우에 대한 비극을 말해서는 안됩니다 한 시간 (인터뷰에서 돌아 왔을 때, 나는 걸었을 때 거의 잠들었습니다, 슬프다 !!) 면접이 끝나기 시작했을 때, 면접관은 그 당시 Fibonacci 시퀀스에 대한 질문을했습니다 그리고 나는 세 가지 변수를 설정하거나 For Loop에 초기화해야한다는 것을 알았습니다 끝, 나는 다음과 같은 첫 번째 방법을 쓸 수 있습니다 개혁 및 금 채굴을위한 황금 기간 (Alibaba의 손에있는 데이터의 99%가 중요한 데이터이며 Baidu와 같은 거인을 주로 홍보하는 데이터의 99%가 비교됩니다. 쓰레기를 사용하여 데이터 분석을 위해 Alibaba는 마스터 한 다양한 사용자 상세 데이터를 분석 할 수 있으며 사용자의 취향과 요구를 더 잘 찾을 수 있으며 정확한 푸시 및 정확한 광고 푸시를 제공 할 수 있습니다. Tencent의 미래의 꿈이 사용자의 삶에서 물, 전기 및 가스가된다면 Alibaba의 가능한 미래의 꿈은 사용자의 음식, 의류, 주택 및 운송, 물, 전기 및 가스 수집 등입니다. 오 ~ 주제로 돌아가 봅시다.
우수한 알고리즘 디자이너의 경우 프로그램 기능 본문의 구현에 기초하여 두 가지만 돌보아야합니다. 하나는 설계 알고리즘의 시간 복잡성이고 다른 하나는 공간 복잡성입니다 (무뚝뚝하게 말하면 프로그램을 실행하는 데 사용되는 시간과 메모리는 다른 응용 프로그램 시나리오를 기반으로합니다. 요구 사항, 일반적으로 시간 또는 일반적으로 사용되는 객체를위한 공간 자원은 일반적으로 메모리에 상주하여 응답 시간을 개선합니다 (캐싱 기술 및 가장 인기있는 NOSQL 데이터베이스의 대부분은 비교적 귀중한 메모리 리소스가있는 임베디드 시스템을 사용합니다. 임베디드 시스템의 경우 시간이 지연됩니다.
Febonasi 시리즈의 세 가지 구현에 대해 이야기 해 봅시다.
먼저 Febonasi 시퀀스에 대해 이야기 해 봅시다.
텍스트 관점에서, Fibonacci 시퀀스는 0과 1으로 시작하고, 후속 Fibonacci 계수는 이전 두 숫자에 의해 추가되며, 시퀀스 형식은 다음과 같습니다.
0, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, ………………
수학에서는 재귀 방법으로 정의됩니다.
f_0 = 0
F_1 = 1
f_n = f_ {n-1}+ f_ {n-2}
요구 사항 구현 : 일련 번호 n을 입력하고 해당 Febonacci 번호를 얻으려면 돌아갑니다.
프로그램 구현 1- 기능 자체화
코드 사본은 다음과 같습니다.
/**
* 기능 자체화
* @title : fntype1
* @description : TODO
* @param @param n
* @param @return
* @return int
* @throws 예외
*/
public int fntype1 (int n)은 예외 {
if (n == 0) {
반환 0;
} else if (n == 1 || n == 2) {
반환 1;
} else if (n> 2) {
int temp = fntype1 (n-1)+fntype1 (n-2);
if (temp <0) {
새로운 예외 ( "int 유형의 잘못된 값, 너무 큰 값");
}또 다른{
반환 온도;
}
}또 다른{
새 예외를 던지십시오 ( "n에 대한 불법 값, n> = 0"을 입력하십시오);
}
}
이 방법의 단점 : 많은 반복이 지속적으로 스택 공간을 소비합니다 (웹 개발, 디버깅 및 유지 보수에 참여하는 사람들은 서버 스택 리소스의 값을 알아야합니다. 많은 동시 호출 반복으로 인해 서버 스택 자원이 재활용됩니다. 오랫동안 웹 서버 충돌이 발생하면 기능이 상대적으로 자폐증입니다 (우수한 인터페이스는 입력 및 출력의 가능한 오류 정보를 캡처하고 명확한 처리 결과를 제공해야합니다. 발생하고 디버깅은 일반적으로 이러한 방식으로 사용하는 것이 권장되지 않습니다.
프로그램 구현 2- 우주 시간
코드 사본은 다음과 같습니다.
/**
* 공간을 바꿀 시간
* @title : fntype2
* @description : TODO
* @param @param n
* @param @return
* @return int (n <0 리턴 -1, 최대 INT 크기 반환 -2)
* @throws
*/
public int fntype2 (int n) {
int result = -1;
int temp1 = 0;
int temp2 = 1;
for (int index = 0; index <= n; index ++) {
if (index == 0) {
결과 = temp1;
} else if (index == 1) {
결과 = temp2;
}또 다른{
결과 = temp1+temp2;
if (result <0) {
결과 = -2;
부서지다;
}
temp1 = temp2;
temp2 = 결과;
}
}
반환 결과;
}
이 방법은 주로 다음과 같이 사용됩니다. 시나리오 1 : 객체 또는 변수가 덜 자주 사용되며 한 번 사용 후에 다시 사용되지 않는 시나리오의 경우 : 실시간 요구 사항이 너무 높지 않습니다. 이 방법은 종종 설계에 사용됩니다.
프로그램 구현 3- 시간을위한 공간
코드 사본은 다음과 같습니다.
개인 정적 목록 <integer> fndata = new Arraylist <integer> ();
개인 정적 최종 int maxsize = 50000;
/**
* 이니셜 라이저
* @title : setfndata
* @description : TODO
* @param
* @return void
* @throws
*/
개인 정적 void setfndata () {
int result = -1;
int temp1 = 0;
int temp2 = 1;
for (int index = 0; index <= maxsize; index ++) {
if (index == 0) {
결과 = temp1;
} else if (index == 1) {
결과 = temp2;
}또 다른{
결과 = temp1+temp2;
if (result <0) {
결과 = -2;
부서지다;
}
temp1 = temp2;
temp2 = 결과;
}
fndata.add (결과);
}
}
/**
* 외부 인터페이스
* @title : getfndata
* @description : TODO
* @param @param n
* @param @return
* @return int <span style = "font-family : sans-serif;"> (n beyond fndata.size () 및 n <0 return -1) </span>
* @throws
*/
public int getfndata (int n) {
if (fndata.size () == 0) {
setfndata ();
}
if (fndata.size ()> n && n> = 0) {
return fndata.get (n);
}또 다른{
반품 -1;
}
}
이 방법은 일반적으로 객체 또는 변수가 존재하거나 외부 웹 서비스 인터페이스를 호출, 추상화 지속성 계층, 일반적으로 사용되는 구성 파일 매개 변수로드 등과 같은 프로그램의 전체 수명주기에서 자주 호출되는 시나리오에서 사용됩니다.
테스트 사례 :
코드 사본은 다음과 같습니다.
패키지 com.dbc.yangg.swing.test;
java.util.arraylist 가져 오기;
Java.util.list 가져 오기;
/**
* 시퀀스 번호 n을 입력하고 해당 Febonacci 번호를 얻으려면 돌아갑니다.
* @ClassName : init
* @description : TODO
* @author [email protected]
* @Date 2014 년 1 월 10 일 오후 7:52:13
*
*/
공개 클래스 init {
/**
* 기능 자체화
* @title : fntype1
* @description : TODO
* @param @param n
* @param @return
* @return int
* @throws 예외
*/
public int fntype1 (int n)은 예외 {
if (n == 0) {
반환 0;
} else if (n == 1 || n == 2) {
반환 1;
} else if (n> 2) {
int temp = fntype1 (n-1)+fntype1 (n-2);
if (temp <0) {
새로운 예외 ( "int 유형의 잘못된 값, 너무 큰 값");
}또 다른{
반환 온도;
}
}또 다른{
새 예외를 던지십시오 ( "n에 대한 불법 값, n> = 0"을 입력하십시오);
}
}
/**
* 공간을 바꿀 시간
* @title : fntype2
* @description : TODO
* @param @param n
* @param @return
* @return int (n <0 리턴 -1, 최대 INT 크기 반환 -2)
* @throws
*/
public int fntype2 (int n) {
int result = -1;
int temp1 = 0;
int temp2 = 1;
for (int index = 0; index <= n; index ++) {
if (index == 0) {
결과 = temp1;
} else if (index == 1) {
결과 = temp2;
}또 다른{
결과 = temp1+temp2;
if (result <0) {
결과 = -2;
부서지다;
}
temp1 = temp2;
temp2 = 결과;
}
}
반환 결과;
}
개인 정적 목록 <integer> fndata = new Arraylist <integer> ();
개인 정적 최종 int maxsize = 50000;
/**
* 시간을 바꿀 공간
* @title : setfndata
* @description : TODO
* @param
* @return void
* @throws
*/
개인 정적 void setfndata () {
int result = -1;
int temp1 = 0;
int temp2 = 1;
for (int index = 0; index <= maxsize; index ++) {
if (index == 0) {
결과 = temp1;
} else if (index == 1) {
결과 = temp2;
}또 다른{
결과 = temp1+temp2;
if (result <0) {
결과 = -2;
부서지다;
}
temp1 = temp2;
temp2 = 결과;
}
fndata.add (결과);
}
}
/**
*
* @title : getfndata
* @description : TODO
* @param @param n
* @param @return
* @return int (n fndata.size ()를 넘어 N <0 리턴 -1)
* @throws
*/
public int getfndata (int n) {
if (fndata.size () == 0) {
setfndata ();
}
if (fndata.size ()> n && n> = 0) {
return fndata.get (n);
}또 다른{
반품 -1;
}
}
/**
*
* @Title : 메인
* @description : TODO
* @param @param argv
* @return void
* @throws
*/
public static void main (String [] argv) {
init init = new init ();
int n = 46;
노력하다 {
System.out.println ( "type1 ="+init.fntype1 (n));
} catch (예외 e) {
// TODO 자동 생성 캐치 블록
System.out.println (e.getMessage ());
}
System.out.println ( "type2 ="+init.fntype2 (n));
System.out.println ( "type3 ="+init.getfndata (n));
}
}
출력 결과 :
코드 사본은 다음과 같습니다.
타입 1 = 1836311903
타입 2 = 1836311903
타입 3 = 1836311903
알고리즘을 설계 할 때는 개념을 맹목적으로 따르지 않고 사람들이 필요할 때이 시대에는 특정 응용 프로그램 시나리오를 결합하여 아이디어가 더 유리합니다.
불만을 제기하겠습니다. 우수한 데이터 구조 설계가 알고리즘 설계의 복잡성을 단순화하고 코드 가독성, 프로그램 확장 성 및 실행 효율성을 향상시킬 수 있다고 개인적으로 믿습니다.
다시 불만을 제기하겠습니다. 수요 분석을 수행 할 때 1. 사용자의 관점과 사고 방식에서 분석 한 것은 반드시 원하는 것은 아닙니다. 프로그램 개발의 원칙은 다음과 같습니다. 자신의 취향을 적극적으로 개선하고 사용자의 사용 관점 및 사용 시나리오에서 기능을 분석합니다. 사용자가 어떤 상황에서 호출되는지, 매개 변수를 전달함으로써 발생할 수있는 예외, 인터페이스 구현에서 발생할 수있는 예외, 명확한 출력, 우수한 기능 자폐증; 그런 다음 비즈니스 구현을 기반으로 사용자 사용 습관 및 기타 측면에서 UI를 사용자로 설계해야합니다. 매우 흥미 롭습니다. 요구 사항과 개발이 너무 많으면 자연스럽게 O (∩_AT) O ~를 이해할 수 있습니다.