GMM
containDuplicateIII
采用二叉排序树,这是第一个,以为里面需要有一个查找nums[i]-t的第一个位置,然后看第一个元素是否<=nums[i]+t, 如果是的话,说明存在,否则就找不到了。
同时维护二叉排序树只有k个元素,如果超过k个元素一定,里面位于最前面的
元素一定是和当前查询的元素index差值超过k的。所以要维护k个元素的二叉排序树即可。
然后利用lower_bound函数就可以实现二叉查找了。
class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
int n=nums.size();
deque<int> L;
multiset<int> mul;
for(int i=0;i<n;i++)
{
if(L.size()>k)
{
//int cur=;
mul.erase(mul.find(L.front()));
L.pop_front();
}
auto it=mul.lower_bound(nums[i]-t);
if(it==mul.end() || (LL)*it>(LL)nums[i]+(LL)t)
{
L.push_back(nums[i]);
mul.insert(nums[i]);
}
else return 1;
}
return 0;
}
};
最坑爹的是,这里面用deque可以,但是list来模拟队列就不行。
可能是STL性能的差别。
http://blog.csdn.net/abcjennifer/article/details/8198352
GMM 模型是 一种混合模型,求解用EM算法。
高斯混合模型,多个高斯分布的混合,每个高斯分布有一个混合比例。
p(x)=sum(k=1->k) pi(k)N(x|k),
其中pi是每个分布的权重,N是高斯分布的概率密度函数
这是这个模型的定义。
我们用最大似然估计来求解模型,x1…xN, 每个数据都是从高斯分布中采样,概率p(xi), 因此最大似然估计就是使得这个数据产生的概率最大,假定独立同分布,因此直接乘积,用对数似然可以使得求解方便(Richael Zhang博客里说的是解决下溢的问题)
然后套用EM的框架,具体公式见Richael Zhang的博客,
E步生成r(i, k) 表示xi由第k个正式分布生成的概率
M步估算参数,K个均值向量和协方差矩阵,以及每个分布的混合权重
然后重复迭代直到似然函数收敛
模型:GMM
策略:最大似然估计
算法:EM