当前位置: 代码迷 >> J2SE >> 前几天阿里巴巴的笔试题解决办法
  详细解决方案

前几天阿里巴巴的笔试题解决办法

热度:244   发布时间:2016-04-24 18:03:57.0
前几天阿里巴巴的笔试题
问题1:马尔科夫(HMM)的特征是什么?
问题2:有两个有序整数集合a和b,写一个函数找出它们的交集?

题目的意思应该是这样的,第一道题不会做,第二道题直接写不算难,我觉得应该是考写出比较高效的算法

大家帮忙回答。

------解决方案--------------------
Java code
import java.util.Arrays;public class Test {    public static void main(String args[]){        int[] b = {4, 6, 7, 7, 7, 7, 8, 8, 9, 10, 100, 130, 130, 140, 150};        int[] a = {2, 3, 4, 4, 4, 4, 7, 8, 8, 8, 8, 9, 100, 130, 150, 160};        int[] c = intersect(a, b);        System.out.println(Arrays.toString(c));    }    public static int[] intersect(int[] a, int[] b) {        if(a[0] > b[b.length - 1] || b[0] > a[a.length - 1]) {            return new int[0];        }        int[] intersection = new int[Math.max(a.length, b.length)];        int offset = 0;        for(int i = 0, s = i; i < a.length && s < b.length; i++) {            while(a[i] > b[s]) {                s++;            }            if(a[i] == b[s]) {                intersection[offset++] = b[s++];            }            while(i < (a.length - 1) && a[i] == a[i + 1]) {                i++;            }        }        if(intersection.length == offset) {            return intersection;        }        int[] duplicate = new int[offset];        System.arraycopy(intersection, 0, duplicate, 0, offset);        return duplicate;    }}
------解决方案--------------------
[code=Java][/code]
第二道题

import java.util.ArrayList;

public class Compare {

/**假设两个有序整数集合a和b是两个数组。
* @param a 有序整数集合a
* @param b 有序整数集合b
*/

public ArrayList<Integer> compareTwo(int a[],int []b){
ArrayList<Integer> list=new ArrayList<Integer>();
int numOfStart=0;
boolean isEnd=false;
if(a[0]>b[0]){
if(a[0]>b[b.length-1]){
System.out.println("有序整数集合a和b没有交集");
}else{
for(int i=1;i<b.length;i++){
if(a[0]>b[i-1]&&a[0]<=b[i]){
numOfStart=i;
}
}
for(int j=0;j<a.length;j++){

for(int n=numOfStart;n<b.length;n++){

if(a[j]==b[n]){
list.add(a[j]);
numOfStart=n+1;
break;
}
}
}
}
}else if(a[a.length-1]<b[0]){
System.out.println("有序整数集合a和b没有交集");
}else {
for(int i=1;i<a.length;i++){
if(b[0]>a[i-1]&&b[0]<=a[i]){
numOfStart=i;
}
}
for(int j=0;j<b.length;j++){
for(int n=numOfStart;n<a.length;n++){
if(b[j]==a[n]){
list.add(b[j]);
numOfStart=n+1;
break;
}

}

}
}

return list;
}
public static void main(String[] args) {
Compare com=new Compare();
int b[] ={1,2,4,5,7,8,9,10};
int a[]={5,6,7,8,9,10};
ArrayList<Integer> list=com.compareTwo(a, b);
for(Integer in:list)
System.out.print(in+" ");

}

}

------解决方案--------------------
一个隐马尔可夫模型 (HMM) 是一个五元组: 
(ΩX , ΩO, A, B, π ) 
其中: 
ΩX = {q1,...qN}:状态的有限集合 
ΩO = {v1,...,vM}:观察值的有限集合 
A = {aij},aij = p(Xt+1 = qj |Xt = qi):转移概率 
B = {bik},bik = p(Ot = vk | Xt = qi):输出概率 
π = {πi}, πi = p(X1 = qi):初始状态分布 
2 解决问题:
令 λ = {A,B,π} 为给定HMM的参数,
令 σ = O1,...,OT 为观察值序列,
隐马尔可夫模型(HMM)的三个基本问题: 
2.1评估问题:对于给定模型,求某个观察值序列的概率p(σ|λ) ;
2.2解码问题:对于给定模型和观察值序列,求可能性最大的状态序列;
2.3学习问题:对于给定的一个观察值序列,调整参数λ,使得观察值出现的概率p(σ|λ)最大

------解决方案--------------------
  相关解决方案