第一次面试小记

第一次面试小记

昨天去上海参加了一家公司面试,面试的是爬虫岗。下面我就记录一下遇到的问题。问题先后顺序按想到哪个写哪个。

1.多线程

进程是程序执行的最小单元,每个进程都有自己独立的内存空间,而线程是进程的一个实体,是系统调用的一个基本单位。

当我们启动一个app的时候这就创建了一个进程,这个app里可能有语音播放、搜索等功能,这就是进程里不同的线程。线程是轻量级的,他没有独立的空间地址(内存空间),因为他是由进程创建的,寄存在进程的内存地址中。一个进程会包含多个线程。线程有5中状态(新建状态、就绪状态、运行状态、阻塞状态、死亡状态)下面是一个简单的多线程代码:

import threading
import time
def my_thread(threadName):
    time.sleep(1)
    print('线程:' + str(threadName)+'正在执行')
    print('hello')
if __name__ == '__main__':
    for i in range(4):
        t = threading.Thread(target=my_thread,args=(i,))
        t.start()

可以看到结果是杂乱无序的,这就是多线程在互相抢占资源,造成输出的顺序不同。下面我会提供一个多线程爬虫例子。

2.快速排序

参考链接:https://cuijiahua.com/blog/2017/12/algorithm_4.html

面试官随机提的一个数据结构题目,很遗憾没答出来,也是平时刷的不够多。在此我贴一下代码。

def QuickSort(input_list, left, right):
    def division(input_list, left, right):
        base = input_list[left]
        while left < right:
            while left < right and input_list[right] >= base:
               right -= 1
            input_list[left] = input_list[right]
            while left < right and input_list[left] <= base:
               left += 1
            input_list[right] = input_list[left]
        input_list[left] = base
        return  left
    if left < right:
        base_index = division(input_list,left,right)
        QuickSort(input_list,left,base_index-1)
        QuickSort(input_list,base_index+1,right)
if __name__ == '__main__':
    input_list = [7,4,8,2,4,8,1,0]
    print('排序前:',input_list)
    QuickSort(input_list,0,len(input_list)-1)
    print('排序后:',input_list)

算法流程图如下:

上图中,演示了快速排序的处理过程:

初始状态为一组无序的数组:2、4、5、1、3。

经过以上操作步骤后,完成了第一次的排序,得到新的数组:1、2、5、4、3。

新的数组中,以2为分割点,左边都是比2小的数,右边都是比2大的数。

因为2已经在数组中找到了合适的位置,所以不用再动。

2左边的数组只有一个元素1,所以显然不用再排序,位置也被确定。(注:这种情况时,left指针和right指针显然是重合的。因此在代码中,我们可以通过设置判定条件left必须小于right,如果不满足,则不用排序了)。

而对于2右边的数组5、4、3,设置left指向5,right指向3,开始继续重复图中的一、二、三、四步骤,对新的数组进行排序。

算法性能如下:

1、快速排序算法的性能

排序(4):快速排序

2、时间复杂度

当数据有序时,以第一个关键字为基准分为两个子序列,前一个子序列为空,此时执行效率最差。

而当数据随机分布时,以第一个关键字为基准分为两个子序列,两个子序列的元素个数接近相等,此时执行效率最好。

所以,数据越随机分布时,快速排序性能越好;数据越接近有序,快速排序性能越差。

3、时间复杂度

快速排序在每次分割的过程中,需要 1 个空间存储基准值。而快速排序的大概需要 NlogN次的分割处理,所以占用空间也是 NlogN 个。

4、算法稳定性

在快速排序中,相等元素可能会因为分区而交换顺序,所以它是不稳定的算法。

3.SQL,NoSQL

本科虽然学过数据库这门课,但是后来就没有用过了,所以对数据库可以说完全不了解。面试的时候也闻到了,在此总结一下。
SQL(Structured Query Language)数据库,指关系型数据库,主要代表:SQL Sever,Oracle,MySQL(开源),PostgreSQL(开源)。NoSQL(Not Only SQL)泛指非关系型数据库。主要代表:MongoDB,Redis,CouchDB。

SQL数据存在特定结构的表中;而NoSQL则更加灵活和可扩展,存储方式可以省是JSON文档、哈希表或者其他方式。SQL通常以数据库表形式存储数据。举个栗子,存个学生借书数据:

而NoSQL存储方式比较灵活,比如使用类JSON文件存储上表中熊大的借阅数据:

4.Python2和3的区别

1.print 函数

print语句没有了,取而代之的是print()函数。

2.除法运算

python2.x整数相除得整数,浮点数相除得浮点数,python3.x整数相除也会得到浮点数

3.range和xrange

range返回的是一个list对象,而xrange返回的是一个生成器对象(xrange object)。

.xrange则不会直接生成一个list,而是每次调用返回其中的一个值,内存空间使用极少,因而性能非常好

4.不等运算符

Python 2.x中不等于有两种写法 != 和 <>

Python 3.x中去掉了<>, 只有!=一种写法

 

猜你喜欢

转载自blog.csdn.net/qq_25174673/article/details/85001482