python掷骰子怎么计算时间复杂度_python – 我的算法的时间复杂度计算_锦囊妙记的博客-程序员宅基地

技术标签: python掷骰子怎么计算时间复杂度  

您的算法的时间复杂度为O(kn),其中k是字符串中唯一字符的数量.如果k是常数,那么它是O(n).由于问题描述明确界定了元素的替代数量(“假设小写(ASCII)字母”),因此k是常数,并且您的算法在此问题的O(n)时间内运行.即使n将增长到无限,你只会制作字符串的O(1)个切片,你的算法将保持为O(n).如果你删除了轨道,那么它将是O(n²):

In [36]: s = 'abcdefghijklmnopqrstuvwxyz' * 10000

In [37]: %timeit firstUniqChar(s)

100 loops, best of 3: 18.2 ms per loop

In [38]: s = 'abcdefghijklmnopqrstuvwxyz' * 20000

In [37]: %timeit firstUniqChar(s)

10 loops, best of 3: 36.3 ms per loop

In [38]: s = 'timecomplexity' * 40000 + 'a'

In [39]: %timeit firstUniqChar(s)

10 loops, best of 3: 73.3 ms per loop

它几乎认为T(n)仍然具有O(n)复杂度 – 它与字符串中的字符数精确地线性缩放,即使这是您算法的最坏情况 – 没有单个字符这是独一无二的.

我将在这里提出一种不那么有效但简单而聪明的方法;首先用collections.Counter计算字符直方图;然后迭代找到那个的角色

from collections import Counter

def first_uniq_char_ultra_smart(s):

counts = Counter(s)

for i, c in enumerate(s):

if counts[c] == 1:

return i

return -1

first_uniq_char('timecomplexity')

这具有O(n)的时间复杂度;计数器在O(n)时间内计算直方图,我们需要再次为O(n)字符枚举字符串.然而在实践中我相信我的算法具有低常量,因为它使用Counter的标准字典.

让我们做一个非常愚蠢的暴力算法.由于您可以假设字符串仅包含小写字母,因此请使用以下假设:

import string

def first_uniq_char_very_stupid(s):

indexes = []

for c in string.ascii_lowercase:

if s.count(c) == 1:

indexes.append(s.find(c))

# default=-1 is Python 3 only

return min(indexes, default=-1)

让我们在Python 3.5上测试我的算法和其他答案中的一些算法.我选择了一个对我的算法来说病态不好的案例:

In [30]: s = 'timecomplexity' * 10000 + 'a'

In [31]: %timeit first_uniq_char_ultra_smart(s)

10 loops, best of 3: 35 ms per loop

In [32]: %timeit karin(s)

100 loops, best of 3: 11.7 ms per loop

In [33]: %timeit john(s)

100 loops, best of 3: 9.92 ms per loop

In [34]: %timeit nicholas(s)

100 loops, best of 3: 10.4 ms per loop

In [35]: %timeit first_uniq_char_very_stupid(s)

1000 loops, best of 3: 1.55 ms per loop

所以,我的愚蠢算法是最快的,因为它在最后找到了a并且挽救了.我的智能算法速度最慢,除了最糟糕的情况之外,我的算法性能不佳的另一个原因是OrderedDict是用Python 3.5编写的,而Counter是用Python编写的.

让我们在这里做一个更好的测试:

In [60]: s = string.ascii_lowercase * 10000

In [61]: %timeit nicholas(s)

100 loops, best of 3: 18.3 ms per loop

In [62]: %timeit karin(s)

100 loops, best of 3: 19.6 ms per loop

In [63]: %timeit john(s)

100 loops, best of 3: 18.2 ms per loop

In [64]: %timeit first_uniq_char_very_stupid(s)

100 loops, best of 3: 2.89 ms per loop

所以看起来我的“愚蠢”算法并不是那么愚蠢,它利用了C的速度,同时最大限度地减少了运行的Python代码的迭代次数,并在这个问题中获得了明显的胜利.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42298754/article/details/113670667

智能推荐

NSStringDrawingOptions_yinachong的博客-程序员宅基地

NSStringDrawingTruncatesLastVisibleLine:如果文本内容超出指定的矩形限制,文本将被截去并在最后一个字符后加上省略号。如果没有指定NSStringDrawingUsesLineFragmentOrigin选项,则该选项被忽略。NSStringDrawingUsesLineFragmentOrigin:绘制文本时使用 line fragement or

条件注解@ConditionalOnBean失效原因_zhm_sky的博客-程序员宅基地_conditionalonbean不生效

测试环境(配置类)@Import({User.class,Pet.class})@Configuration(proxyBeanMethods = true)public class MyConfig { @Bean @ConditionalOnBean(name = "cat") public User user(){ return new User("航书", 12); } @Bean("cat") public

一重指针、二重指针做函数参数的深刻分析(虽然很基础,但要深刻理解)_ShenHang_的博客-程序员宅基地

一重指针做函数参数#include<iostream>using namespace std;void change(int *p){ *p = 20; p++; cout << p << endl;}int main() { int a = 10; change(&a); cout << &a <&lt...

java设置图片点击渐变透明,图片实现渐变/透明效果_weixin_39569753的博客-程序员宅基地

众所周知,图片等一些盒子都可以利用opacity属性来设置不透明度,但是前两天我朋友忽然给我一个截图,截图效果如下图中红框圈住的位置图片或者说摄像头采集的画面出现了渐变到透明,可以清楚的看到可以看到后面小哥的胳膊,然后问我如何实现这种效果,这下把我难住了(呵 天天给我出难题),我开始在个大论坛开始寻找解决方案;忽然在前天,日常逛论坛时看到一个文字投影的效果,而后忽然灵机一动就想,能不能变相的实现前...

java笔记_笑容温暖城寨的博客-程序员宅基地

安卓课的Java扩展笔记包类命名规范总结输出换行与不换行mian方法中的args参数Math类快捷输出语句static关键字定义无参方法定义带返回值方法包package com.eoe.basic.day01;//包名 在java当中用.表示windos中的/,一般格式:com.公司名.项目名.业务模块名称例如:com.sina.crm.user类命名规范总结1、java中可以有多个类2、java中可以有多个类,但是最多只有一个类的类名和文件名相同3、如果一个类被public修饰,那该类

一、网络游戏架构的前世今生(2)_王元恺David的博客-程序员宅基地

网络游戏架构演进史,优化游戏网络,自定义网络协议

随便推点

oracle设置core文件大小,Linux的Core文件设置与调试_李daxin的博客-程序员宅基地

一、运行时错误任何人写程序都会出错,正如《C++编程规范》所说,真正可怕的错误不是编译时的错误,而是运行时错误。有的程序可以通过编译, 但在运行时会出现Segment fault(段错误)这通常都是指针错误(一般就是空指针)引起的,或者访问了不能访问的内存(数组越界,系统保护)二、core文件我们不可能用GDB一句一句的去找,真正的英雄都善于使用手中的武器。这就是core file所谓core,就...

redis客户端连接遇到的坑,记录一下_choujulong7459的博客-程序员宅基地

期间出现的错误如下:1.connect timeout2.connect refused3.遗失对主机的连接denied redis is running in protected mode。。。。。。总结处理这些报错的步骤:1.关闭centos防火墙2.修改redis.conf文...

[原创]FineUI秘密花园(六) — 表单控件_hong2511的博客-程序员宅基地

FineUI中有哪些常用的表单控件,它们有什么共同点和不同点,这一篇文章我们会详细解说。 表单控件的公共属性 所有的表单都具有如下属性: ShowLabel:是否显示标签(默认值:t

fineui mysql_FineUI 相关_卖家胖蝌蚪的博客-程序员宅基地

FineUI 开源版(原ExtAsp.Net)Last updated:2017-03SURFSKYhttp://pan.baidu.com/share/home?uk=170857326#category/type=0---------------------------------------------------配置&预设http://fineui.com/demo/#/demo/...

手把手教你使用FineUI+动软代码生成器开发一个b/s结构的取送货管理信息系统(附源码)之开篇_编程鸭的博客-程序员宅基地

一 本系列随笔概览及产生的背景近阶段接到一些b/s类型的软件项目,但是团队成员之前大部分没有这方面的开发经验,于是自己选择了一套目前网上比较容易上手的开发框架(FineUI),计划录制一套视频讲座,来讲解如何利用FineUI快速开发一个小型的b/s结构的管理系统,已达到帮助团队成员快速掌握b/s结构信息系统的开发方法。源码位置:https://github.com/kamiba/FineU...