首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

每日三问合辑二

19.最长公共子序列与最长公共子串的区别?

最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequence,LCS)的区别为:子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列;也就是说,子串中字符的位置必须是连续的,子序列则可以不必连续。

20.如何用代码实现最长公共子序列

# -*- coding: utf-8 -*-

#!/usr/bin/python

import numpy

def find_lcseque(s1, s2):

#生成字符串长度加1的矩阵,m用来保存对应位置匹配的结果

m = [ [ 0 for x in range(len(s2)+1) ] for y in range(len(s1)+1) ]

# d用来记录转移方向

d = [ [ None for x in range(len(s2)+1) ] for y in range(len(s1)+1) ]

for p1 in range(len(s1)):

for p2 in range(len(s2)):

if s1[p1] == s2[p2]: #字符匹配成功,则该位置的值为左上方的值加1

m[p1+1][p2+1] = m[p1][p2]+1

d[p1+1][p2+1] = 'ok'

elif m[p1+1][p2] > m[p1][p2+1]: #左大于上,则该位置为左值,并标记回溯的方向

m[p1+1][p2+1] = m[p1+1][p2]

d[p1+1][p2+1] = 'left'

else: #上值大于左值,则该位置的值为上值,并标记方向up

m[p1+1][p2+1] = m[p1][p2+1]

d[p1+1][p2+1] = 'up'

(p1, p2) = (len(s1), len(s2))

print numpy.array(d)

s = []

while m[p1][p2]: #不为None时

c = d[p1][p2]

if c == 'ok': #匹配成功,插入该字符,并向左上角找下一个

s.append(s1[p1-1])

p1-=1

p2-=1

if c =='left': #根据标记,向左找下一个

p2 -= 1

if c == 'up': #根据标记,向上找下一个

p1 -= 1

s.reverse()

return ''.join(s)

print find_lcseque('abdfg','abcdfg')

若提示安装numpy包,尝试按照以下步骤:

step1:先安装setuptools

1.wget --no-check-certificatehttps://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz

2.解压

3.cd进入解压后的路径

4.输入命令:python setup.py install

step2:再安装numpy

1.在官网上下载该包:http://sourceforge.net/projects/numpy/files/

2.解压

3.cd进入解压后的路径

4.输入命令:python setup.py install

5.安装完成

6.测试代码

21.如何用代码实现最长公共子串

# -*- coding: utf-8 -*-

#!/usr/bin/python

def find_lcsubstr(s1, s2):

m=[[0 for i in range(len(s2)+1)] for j in range(len(s1)+1)] #生成矩阵,为方便后续计算,比字符串长度多了一列

mmax=0 #最长匹配的长度

p=0 #最长匹配对应在s1中的最后一位

for i in range(len(s1)):

for j in range(len(s2)):

if s1[i]==s2[j]:

m[i+1][j+1]=m[i][j]+1

if m[i+1][j+1]>mmax:

mmax=m[i+1][j+1]

p=i+1

return s1[p-mmax:p],mmax #返回最长子串及其长度

print find_lcsubstr('abcdfg','abdfg')

22.linux中wget 、apt-get、yum rpm区别?

wget是一种下载工具,类似于迅雷。

rpm:软件管理的软件,全称为redhat package management,用于安装卸载.rpm软件

yum:是linux系统下的一种软件安装方式,全称为Yellow dog Updater Modified,基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。

串联一下:

使用wget下载一个rpm包,然后用rpm -ivh xxx.rpm安装这个软件。嫌麻烦的话,就可以直接用yum install xxx来自动下载和安装依赖的rpm软件。

23.先验概率和后验概率的区别?

先验概率(prior probability)是指根据以往经验和分析得到的概率,如全概率公式,它往往作为"由因求果"问题中的"因"出现的概率。

后验概率( posterior probability)是指通过调查或其它方式获取新的附加信息,利用贝叶斯公式对先验概率进行修正,而后得到的概率,而且在利用样本资料计算逻辑概率时,还要使用理论概率分布,需要更多的数理统计知识。

举一个简单的例子:一口袋里有3只红球、2只白球,采用不放回方式摸取,求:

第一次摸到红球(记作A)的概率;

第二次摸到红球(记作B)的概率;

已知第二次摸到了红球,求第一次摸到的是红球的概率。

解:

P(A)=3/5,这就是验前概率;

P(B)=P(A)P(BA)+P(A逆)P(BA逆)=3/5;

P(AB)=P(A)P(BA)/P(B)=1/2,这就是验后概率。

24.一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。

这题是考虑时间效率,用trie树统计每个词出现的次数,时间复杂度是O(n*len)(len表示单词的平均长度)。然后是找出出现最频繁的前10个词,可以用堆实现,时间复杂度是O(n*lg10),所以总的时间复杂度是O(n*len+n*lg10)。

25.Trie树和Hashmap的适用情况?

HashMap哈希表:用于解决O(1)的精确查找,无论是内存中实现程序逻辑还是外存中实现key - value存储,几乎无处不用

Trie字典树:用于解决前缀检索,属于模糊查找,最经典的应用就是搜索suggest,搜索"变形",suggest给你"变形金刚"

区别:最基本的用处不一样。Trie在前缀查询方面应用是要比hashmap快的多的。举个栗子,你有一篇动漫分析文章,外加一个动漫人物名称字典dict,怎么从文章中直接把所有动漫人物爬出来。如果你要用hashmap(或者hashset),最基本的用法就是把动漫人物名全存到map或者set里,扫描文章的每一个字,以这个字为人名开头,向后搜索若干位,知道最大人名长度,如果hashset里都没有的话,扫描下一个字作为人名开头。可以发现巨慢无比,时间复杂度O(mn)。用trie的话不用重复搜索,复杂度O(n)可以实现。

原答案链接:

https://www.zhihu.com/question/264056945/answer/276580308

26.数据库和数据仓库的区别?OLTP和OLAP的区别?

数据库(DataBase,DB):数据库是计算机应用系统中的一种专门管理数据资源的系统。管理数据库的软件称为数据库管理系统(DataBase Management System,DBMS),如SYBASE、DB2、ORACLE、MySQL、ACCESS等。

数据仓库(DataWareHouse,DWH):是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。 在数据库已经大量存在的情况下,为了进一步挖掘数据资源、为了决策需要而产生。

当今的数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果.

27.如何查看RDD的内容?

(1)写出到文件系统,即调用所使用的RDD的类中类似saveasTextFile()的方法,例如对于JavaPairRDD的对象x,可以用x.saveasTextFile("输出文件路径")。

(2)还可将RDD转回List处理查看:有take()方法和collect()方法,但是collect方法会将整个RDD内容集中,如果数据集过大,在网络传输和内存占用上都可能造成压力,如果只是要查看RDD中的几个值还是take方法较为合适。

28.Hive中两字段相除,结果保留两位小数

select cast(字段1/字段2 as decimal(18,2)) from table_a;

29.计算文本中每行单词的数目

# -*- coding: UTF-8 -*-

import sys

wordnum = {} #创建字典,用于存放每行的单词数

lineid = 0

for line in sys.stdin:

ss = line.strip().split(' ')

lineid += 1

wordnum[lineid] = len(ss)

print wordnum

30.写出mapreduce的wordcount

####map.py

import sys

for line in sys.stdin:

ss = line.strip().split(' ')

for s in ss:

if s.strip() != "": #避免单词间出现多个空格,影响排序结果

print "%s\t%s" % (s,1)

####red.py

import sys

current_word = None

count_pool = []

sum = 0

for line in stdin:

word, val = line.strip().split('\t')

if current_word == None:

current_word = word

if current_word != word:

for count in count_pool:

sum += count

print "%s\t%s" % (current_word,sum)

current_word = word

count_pool = []

sum = 0

count_pool.append(int(val))

for count in count_pool:

sum += count

print "%s\t%s" % (current_word, str(sum))

31.用mapreduce如何解决两组数据的归并排序问题

数据a:

0 java

2 java

4 java

...

98 java

100 java

数据b:

1 hadoop

3 hadoop

5 hadoop

...

97 hadoop

99 hadoop

###-map_sort-###

import sys

base_count = 10000

for line in sys.stdin:

ss = line.strip().split('\t')

key = ss[0]

val = ss[1]

new_key = base_count + int(key)

red_idx = 1

if new_key < (10100 + 10000) / 2:

red_idx = 0

print "%s\t%s\t%s" % (red_idx, new_key, val)

###-red_sort-###

import sys

for line in sys.stdin:

idx_id, key, val = line.strip().split('\t')

print '\t'.join([key, val])

32.shell脚本通常有哪些类型

通常写一个shell脚本都要在第一行注明使用什么解释器来解释,即写成:#!/bin/bash

这样的形式,意思是告诉系统要使用/bin/bash这个解释器来解释下面的语句。shell的脚本一般用.sh作为后缀,只要你写的脚本的第一行有#!/bin/bash或者是其他的解释器,如#!/bin/csh,执行该脚本时系统会使用该注明的解释器来解释。

.csh脚本使用csh这个shell解释器来解释。

.sh脚本使用bash或sh解释器来解释。

.py则是使用python来解释。

33.Spark RDD、DataFrame和DataSet的区别

RDD

优点:

1.编译时类型安全,编译时就能检查出类型错误

2.面向对象的编程风格,直接通过类名点的方式来操作数据

缺点:

1.序列化和反序列化的性能开销,无论是集群间的通信,还是IO操作都需要对对象的结构和数据进行序列化和反序列化.

2.GC的性能开销,频繁的创建和销毁对象,势必会增加GC

DataFrame

DataFrame引入了schema和off-heap

•schema: RDD每一行的数据,结构都是一样的.这个结构就存储在schema中. Spark通过schame就能够读懂数据,因此在通信和IO时就只需要序列化和反序列化数据,而结构的部分就可以省略了。

•off-heap:意味着JVM堆以外的内存,这些内存直接受操作系统管理(而不是JVM)。Spark能够以二进制的形式序列化数据(不包括结构)到off-heap中,当要操作数据时,就直接操作off-heap内存.由于Spark理解schema,所以知道该如何操作。

off-heap就像地盘, schema就像地图, Spark有地图又有自己地盘了,就可以自己说了算了,不再受JVM的限制,也就不再收GC的困扰了。

通过schema和off-heap, DataFrame解决了RDD的缺点,但是却丢了RDD的优点。DataFrame不是类型安全的, API也不是面向对象风格的。

DataSet

DataSet结合了RDD和DataFrame的优点,并带来的一个新的概念Encoder

当序列化数据时, Encoder产生字节码与off-heap进行交互,能够达到按需访问数据的效果,而不用反序列化整个对象. Spark还没有提供自定义Encoder的API,但是未来会加入.

34.hashmap的原理,以及如何解决hash冲突?

HashMap 采用一种算法决定每个元素的存储位置。当执行map.put(String,Obect)方法时,系统将调用String的hashCode()方法得到其hashCode值——每个Java对象都有hashCode()方法,都可通过该方法获得它的hashCode值。得到这个对象的hashCode值之后,系统会根据该hashCode值来决定该元素的存储位置。源码中用到了一个重要的内部接口:Map.Entry,每个Map.Entry其实就是一个key-value对。从上面程序中可以看出:当系统决定存HashMap中的key-value对时,完全没有考虑Entry中的value,仅仅只是根据key来计算并决定每个Entry的存储位置。

Hashmap里面的bucket出现了单链表的形式,散列表要解决的一个问题就是散列值的冲突问题,通常是两种方法:链表法和开放地址法。链表法就是将相同hash值的对象组织成一个链表放在hash值对应的槽位;开放地址法是通过一个探测算法,当某个槽位已经被占据的情况下继续查找下一个可以使用的槽位。java.util.HashMap采用的链表法的方式,链表是单向链表。

HashMap里面没有出现hash冲突时,没有形成单链表时,hashmap查找元素很快,get()方法能够直接定位到元素,但是出现单链表后,单个bucket里存储的不是一个Entry,而是一个Entry链,系统只能必须按顺序遍历每个Entry,直到找到想搜索的Entry为止——如果恰好要搜索的Entry位于该Entry链的最末端(该Entry是最早放入该bucket中),那系统必须循环到最后才能找到该元素。

35.简单描述如何安装配置一个apache开源版hadoop,只描述即可,无需列出完整步骤,能列出步骤更好。

1)安装JDK并配置环境变量(/etc/profile)

2)关闭防火墙

3)配置hosts文件,方便hadoop通过主机名访问(/etc/hosts)

4)设置ssh免密码登录

5)解压缩hadoop安装包,并配置环境变量

6)修改配置文件($HADOOP_HOME/conf)

hadoop-env.sh core-site.xml hdfs-site.xml mapred-site.xml

7)格式化hdfs文件系统(hadoop namenode -format)

8)启动hadoop ($HADOOP_HOME/bin/start-all.sh)

9)使用jps查看进程

36.请列出你所知道的hadoop调度器,并简要说明其工作方法。

1)默认调度器FIFO

hadoop中默认的调度器,采用先进先出的原则

2)计算能力调度器Capacity Scheduler

选择占用资源小,优先级高的先执行

3)公平调度器Fair Scheduler

同一队列中的作业公平共享队列中所有资源

以上.

听说,爱点赞的人运气都不会太差哦

如果有任何意见和建议,也欢迎在下方留言~

关注这个公众号,定期会有大数据学习的干货推送给你哦~

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180206G1F40I00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券