Python开发【数据结构】:排序练习
排序练习
问题一:
现在有一个列表,列表中的数范围都在0到100之间,列表长度大约为100万。设计算法在O(n)时间复杂度内将列表进行排序。
import random data = [random.randint(0,100) for x in range(10000)] def count_sort(data):
li = [0 for i in range(101)]
for x in data:
li[x] +=1
count = 0
for k,v in enumerate(li):
for i in range(v):
data[count]=k
count +=1 count_sort(data)
问题二:
现在有n个数(n>10000),设计算法,按大小顺序得到前10大的数。 应用场景:榜单TOP 10
1、插入排序:
import time
import random def call_time(func):
def inner(*args,**kwargs):
t1 = time.time()
re = func(*args,**kwargs)
t2 = time.time()
print('Time cost:',func.__name__,t2-t1)
return re
return inner def insert(li, i):
tmp = li[i]
j = i - 1
while j >= 0 and li[j] > tmp:
li[j + 1] = li[j]
j = j - 1
li[j + 1] = tmp def insert_sort(li):
for i in range(1, len(li)):
insert(li, i)
@call_time
def topk(li, k): #时间复杂度O(kn)
top = li[0:k + 1]
insert_sort(top)
for i in range(k+1, len(li)):
top[k] = li[i]
insert(top, k)
return top[:-1] data = list(range(10000))
random.shuffle(data) print(topk(data, 10))
# Time cost: topk 0.020502567291259766
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2、堆的方式:
取列表前10个元素建立一个小根堆。堆顶就是目前第10大的数。 依次向后遍历原列表,对于列表中的元素,如果小于堆顶,则忽略该元素;如果大于堆顶,则将堆顶更换为该元素,并且对堆进行一次调整; 遍历列表所有元素后,倒序弹出堆顶
import time
import random def call_time(func):
def inner(*args,**kwargs):
t1 = time.time()
re = func(*args,**kwargs)
t2 = time.time()
print('Time cost:',func.__name__,t2-t1)
return re
return inner def sift(data, low, high):
i = low
j = 2 * i + 1
tmp = data[i]
while j <= high: #孩子在堆里
if j + 1 <= high and data[j] < data[j+1]: #如果有右孩子且比左孩子大
j += 1 #j指向右孩子
if data[j] > tmp: #孩子比最高领导大
data[i] = data[j] #孩子填到父亲的空位上
i = j #孩子成为新父亲
j = 2 * i +1 #新孩子
else:
break
data[i] = tmp #最高领导放到父亲位置 @call_time
def topn(li, n): #时间复杂度O(nlogk)
heap = li[0:n]
# 构造包含n个元素列表的大栈堆
for i in range(n // 2 - 1, -1, -1):
sift(heap, i, n - 1) # 把列表中前n个小的数留到栈堆中
for i in range(n, len(li)):
if li[i] < heap[0]:
heap[0] = li[i]
sift(heap, 0, n - 1) # 把栈堆从小到大排列起来
for i in range(n - 1, -1, -1): # i指向堆的最后
heap[0], heap[i] = heap[i], heap[0] # 领导退休,刁民上位
sift(heap, 0, i - 1) # 调整出新领导
return heap data = list(range(10000))
random.shuffle(data) print(topn(data, 10))
# Time cost: topn 0.0015001296997070312
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
问题三:
给定一个列表和一个整数,设计算法找到两个数的下标,使得两个数之和为给定的整数
保证肯定仅有一个结果。 例如,列表[1,2,5,4]与目标整数3,1+2=3,结果为(0, 1)
二分查找的思路:
def bin_search(data_set, val):
low = 0
high = len(data_set) - 1
while low <= high:
mid = (low+high)//2
if data_set[mid] == val:
left = mid
right = mid
while left >= 0 and data_set[left] == val:
left -= 1
while right < len(data_set) and data_set[right] == val:
right += 1
return (left + 1, right - 1)
elif data_set[mid] < val:
low = mid + 1
else:
high = mid - 1
return li = [1,2,3,3,3,4,4,5]
print(bin_search(li, 5))
# (7, 7)
问题四:
给定一个升序列表和一个整数,返回该整数在列表中的下标范围
例如:列表[1,2,3,3,3,4,4,5],若查找3,则返回(2,4);若查找1,则返回[0,0]
import copy
li = [1, 5, 4, 2]
target = 3
max_num = 100 def func1():
for i in range(len(li)):
for j in range(i+1, len(li)):
if li[i] + li[j] == target:
return (i,j) def bin_search(data_set, val, low, high):
while low <= high:
mid = (low+high)//2
if data_set[mid] == val:
return mid
elif data_set[mid] < val:
low = mid + 1
else:
high = mid - 1
return def func2():
li2 = copy.deepcopy(li)
li2.sort()
for i in range(len(li2)):
a = i
b = bin_search(li2, target - li2[a], i+1, len(li2)-1)
if b:
return (li.index(li2[a]),li.index(li2[b])) def func3(): # O(n)复杂度
a = [None for i in range(max_num+1)]
for i in range(len(li)):
a[li[i]] = i
if a[target-li[i]] != None:
return (a[li[i]], a[target-li[i]]) print(func3()) data_dict = {}
for i in range(len(data_list)):
if data_list[i] in data_dict:
print(data_dict[data_list[i]], i)
else:
data_dict[13 - data_list[i]] = i
Python开发【数据结构】:排序练习的更多相关文章
- Python开发——数据结构【深浅拷贝】
浅拷贝 # 浅拷贝只copy一层 s = [3,'Lucy',4,[1,2]] s1 = s.copy() 深拷贝 # 深拷贝——克隆一分 import copy s = [3,'Lucy',4,[1 ...
- Python开发——目录
Python基础 Python开发——解释器安装 Python开发——基础 Python开发——变量 Python开发——[选择]语句 Python开发——[循环]语句 Python开发——数据类型[ ...
- Python开发【前端】:JavaScript
JavaScript入门 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本 ...
- Python 开发轻量级爬虫04
Python 开发轻量级爬虫 (imooc总结04--url管理器) 介绍抓取URL管理器 url管理器用来管理待抓取url集合和已抓取url集合. 这里有一个问题,遇到一个url,我们就抓取它的内容 ...
- Python实现各种排序算法的代码示例总结
Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...
- python 与数据结构
在上面的文章中,我写了python中的一些特性,主要是简单为主,主要是因为一些其他复杂的东西可以通过简单的知识演变而来,比如装饰器还可以带参数,可以使用装饰类,在类中不同的方法中调用,不想写的太复杂, ...
- [0x00 用Python讲解数据结构与算法] 概览
自从工作后就没什么时间更新博客了,最近抽空学了点Python,觉得Python真的是很强大呀.想来在大学中没有学好数据结构和算法,自己的意志力一直不够坚定,这次想好好看一本书,认真把基本的数据结构和算 ...
- python开发学习-day01 (python安装与版本、字符串、字典、运算符、文件)
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- Python开发【第二十篇】:缓存
Python开发[第二十篇]:缓存redis&Memcache 点击这里 Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy ...
- Eclipse和PyDev搭建python开发环境
Eclipse和PyDev搭建python开发环境 1.1整体目标 本文档作为python学习者的新手教程,通过本教程能够了解python用途.语法.在实际工作中的应 ...
随机推荐
- 【Java集合的详细研究3】Arrays类常用方法
1.void sort(array)对数组array的元素进行升序排序 2.int binarySearch(array,val):查询元素值val在数组array中的下标 3.String toSt ...
- 实现QQ第三方登录教程(php)
参看地址:http://www.bcty365.com/content-10-2945-1.html
- SQL 模糊查询LIKE concat用法
concat用来拼接查询的字符串,如下代码所示 SELECT * FROM deployment WHERE name LIKE concat(concat('%',#{queryMessage}), ...
- 结构型模式概述(Structural Pattern)
结构型模式可以描述两种不同的东西:类与类的实例.结构型模式可以分为类结构型模式和对象结构型模式. 类结构型模式关心类的组合,可以由多个类组合成一个更大的系统,在类结构型模式中只存在继承关系和实现关系: ...
- 【Deeplearning】关注书目
Deep Learning: A Practitioner's Approach http://www.amazon.com/Deep-Learning-Practitioners-Adam-Gibs ...
- 利用GetType反射方法再调用方法进行传递参数实现调用
直接上代码: TestMenuService.MenuServiceCSClient tesClient = new TestMenuService.MenuServiceCSClient(); va ...
- linux中,查看某个命令是来自哪个RPM包或者是通过哪个RPM包安装的
需求描述: 今天在测试ssh命令到底是哪个RPM包,安装之后生成的,找了一些文档 在这里进行记录下,主要是rpm -qf命令的使用,查询文件在哪个包里. 操作过程: 1.通过whereis 定位ssh ...
- 工作流JBPM_day02:3-预定义的活动1_4-预定义的活动2+在图片上高亮显示正在执行的上活动
工作流JBPM_day02:3-预定义的活动1 工作流JBPM_day02:4-预定义的活动2+在图片上高亮显示正在执行的上活动 活动 Activity 预先定义好的活动 Start开始活动 End结 ...
- Java精选笔记_IO流(字符输入输出流、字符文件输入输出流、字符流的缓冲区)
字符流 Reader是字符输入流的基类,用于从某个源设备读取字符 Writer是字符输出流,用于向某个目标设备写入字符 字符流操作文件 字符输入流FileReader,通过此流可以从关联的文件中读取一 ...
- Java精选笔记_面向对象(包、访问控制、内存机制、垃圾回收机制)
包 包的定义与使用 专门用来存放类的,通常功能相同的类存放在相同的包中. 包的声明只能位于Java源文件的第一行 Java语言中的常用包 java.lang:包含Java语言的核心类,如String. ...