最近微软的How-Old刷爆了朋友圈,这是一次学术研究与日常生活的结合。实际上还有许多研究与我们密切相关,比如我的研究方向——图像运动复原,可以将该技术应用于相机抖动图像的恢复。然而PC端软件日趋衰落,移动端使用量逐步增长,由于手机处理能力有限,而图像恢复技术需要很大的CPU与内存资源,将该算法部署在云端,所有处理都在云端进行,手机负责传输图像,那么该问题轻松解决。

实施方案:
(1)核心算法:C/C++实现,支持GPU加速,性能指标:10s内处理5000*5000分辨率图像;
(2)交互设计:WEB方式,接收、返回处理结果,实施技术JSP或Python

项目架构:
(1)WEB(Python OR JSP)作为前台访问,底层使用C/C++实现核心算法;
(2)考虑到移动设备处理能力有限,软件维护的代价,以web/host方式较为合理;
(3)后期考虑开发API接口;

技术细节:
(1)流量成本:移动端图像高质量压缩,再减少流量传输同时,尽量保存图像细节;
(2)项目部署:云端

CVTE面试步骤:在线测评、HR面、笔试、技术面、HR终面

技术面遇到做嵌入式的老师,问了若干Linux、数据结构问题,面挂了。整理技术面的问题,算是一次经验吧!

一、Linux

(1)查看系统进程
ps命令用于查看当前正在运行的进程(瞬间信息、不动态变化);top检测系统性能, 实时地提供进程信息(类似与任务管理器)。

(2)查看僵尸进程
首先,我们可以用top命令来查看服务器当前是否有僵尸进程,在下图中可以看到僵尸进程数的提示,如果数字大于0,那么意味着服务器当前存在有僵尸进程
thum-6dbefaa0c8fed11e492ce4e14665744920101221050808.png

下面,我们用ps和grep命令寻找僵尸进程

ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'

命令注解:
-A 参数列出所有进程
-o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数
因为状态为 z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程
运行结果参考如下

Z 12334 12339 /path/cmd

这时,我们可以使用 kill -HUP 12339来杀掉这个僵尸进程
运行后,可以再次运行ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'来确认是否将僵尸进程杀死
如果kill子进程的无效,可以尝试kill 其父进程来解决问题,例如上面例子父进程pid是 12334,那么我们就运行kill -HUP 12334来解决问题。

- 阅读剩余部分 -

该系列主要总结了使用C++来实现各种设计模式,并结合实际的案例来分析如何使用,以及在什么场合下使用设计模式。以下是该系列所有文章的链接。希望对大家有帮助。

C++设计模式——简单工厂模式
C++设计模式——工厂方法模式
C++设计模式——抽象工厂模式
C++设计模式——单例模式
C++设计模式——建造者模式

- 阅读剩余部分 -

Given a string s and a dictionary of words dict, determine if s can be
segmented into a space-separated sequence of one or more dictionary
words.

For example, given s = "leetcode", dict = ["leet", "code"].

Return true because "leetcode" can be segmented as "leet code".

题目来自Leeocode:https://oj.leetcode.com/problems/word-break/

最容易想到的方法是递归算法,先判断字符串前部分是否构成单词,若构成再按照同样方法判断后半部分,写成数学形式更易理解(自顶而上):
(1)设f[1,n]表示字符串1~n位置是否能构成单词,f[1,n]即为最终解;
(2)f[1,n]可以分解为f[1,i]&f[i+1,n],1<=i<n,即f[1,n]=f[1,i]&f[i+1,n];

一、递归算法(深搜)
递归算法每次判别f[1,i]是否输入unodered_set(dict),一旦判断为单词,分解为小规模问题f[i+1,n]。但是递归算法效率很低,提交时Time Limited

bool isWord(int k,string s,unordered_set<string> &dict)
{
    if(k==s.length())
        return true;
    for(int i=k;i<s.length();i++)
    {
        string str;
        for(int j=k;j<=i;j++)
            str.push_back(s[j]);

        if(dict.find(str)!=dict.end())
            if(isWord(i+1,s,dict))
                return true;
    }
    return false;
}

bool wordBreak1(string s, unordered_set<string> &dict) 
{
    for(int i=0;i<s.length();i++)
    {
        string str;
        for(int j=0;j<=i;j++)
            str.push_back(s[j]);

        if(dict.find(str)!=dict.end())
            if(isWord(i+1,s,dict))
                return true;
    }
    return false;
}

- 阅读剩余部分 -