有一个未排序的列表a和一个范围列表,例如ranges = [(10, 20), (30, 50), (15, 35) ...]。 a中的最大值是uint64_t。目标是计算每个范围的元素数量。正常的解决方案非常直观,只需计算范围内的元素并打印结果即可。但问题是来自在线法官。我厌倦了保密的解决方案,但对于每个解决方案,OJ都给出了超过时限的限制。

a的最大长度为10,000,000,ranges的最大长度为1,000,000。

测试列表a具有1000万个随机数,而ranges具有100万对范围:

import numpy as np

a = list(np.random.randint(low=1, high=0x7fffffffffffffff, size=10_000_000))

ranges = []

for _ in range(1_000_000):

x, y = np.random.randint(low=1, high=0x7fffffffffffffff, size=2)

ranges.append((x, y) if x < y else (y, x))

第一个解决方案是:

import bisect

a.sort()

low_d = {}

up_d = {}

def count(r):

low, up = r

if low not in low_d:

l = bisect.bisect_left(a, low)

low_d[low] = l

else:

l = low_d[low]

if up not in up_d:

u = bisect.bisect_right(a, up, lo=l)

up_d[up] = u

else:

u = up_d[up]

return u - l

result = [*map(count, ranges)]

缺点很明显,当sort()很大时,a会非常耗时。

原始的第二个解决方案比上述解决方案要慢得多。

弃。

两种解决方案均导致TLE错误。我使用的OJ就像一个黑盒子,我不知道它用来测试程序的测试示例。

由于该程序在OJ上运行,因此不允许使用numpy。

有什么方法可以优化性能?

参考方案

此C ++代码在此硬件上以1.9s运行,而-O2与我最好的Python代码13.2s相比运行(与Python中的基准测试相比,这是一个较慢的硬件)。

可能的改进:

上等分应在下等分之上搜索

使用预先计算的等分值,例如python代码

从Unisort: an Algorithm to Sort Uniformly Distributed Numbers in O(n) Time. R.T. Ionescu 2013实现Unisort算法

码:

#include

#include

#include

#include

#include

#include

#include

#include

int tdiff(std::chrono::time_point<:chrono::system_clock> start, std::chrono::time_point<:chrono::system_clock> _end) {

int result;

result = (std::chrono::duration_cast<:chrono::milliseconds>(_end - start)).count();

return result;

}

int main()

{

std::random_device rd;

std::mt19937 gen(rd());

std::uniform_int_distribution dis(1, 0x7fffffffffffffff);

#define A_SIZE 10000000

#define R_SIZE 1000000

std::vector a(A_SIZE);

int a_size = A_SIZE;

int r_size = R_SIZE;

for (int i=0; i

a[i] = dis(gen);

}

std::vector<:vector>> ranges1(R_SIZE, std::vector(2));

int64_t x,y;

for (int i=0; i

x = dis(gen);

y = dis(gen);

if (x < y){

ranges1[i] = {x,y};

}else{

ranges1[i] = {y,x};

}

}

std::chrono::time_point<:chrono::system_clock> start, _end;

start = std::chrono::system_clock::now();

std::sort(a.begin(), a.end());

std::vector counts(A_SIZE);

std::vector::iterator l;

std::vector::iterator u;

for (int i=0; i

l = std::lower_bound(a.begin(),a.end(),ranges1[i][0]);

u = std::upper_bound(a.begin(),a.end(),ranges1[i][1]);

counts[i] = (int64_t)std::distance(l,u);

}

_end = std::chrono::system_clock::now();

std::cout << tdiff(start, _end) << "\n";

std::cout << counts[0] << "\n";

return 0;

}

Python Pandas导出数据 - python

我正在使用python pandas处理一些数据。我已使用以下代码将数据导出到excel文件。writer = pd.ExcelWriter('Data.xlsx'); wrong_data.to_excel(writer,"Names which are wrong", index = False); writer.…Python 3运算符>>打印到文件 - python

我有以下Python代码编写项目的依赖文件。它可以在Python 2.x上正常工作,但是在使用Python 3进行测试时会报告错误。depend = None if not nmake: depend = open(".depend", "a") dependmak = open(".depend.mak…Python:对于长时间运行的进程,通过还是休眠? - python

我正在编写一个队列处理应用程序,该应用程序使用线程等待和响应要发送到该应用程序的队列消息。对于应用程序的主要部分,只需要保持活动状态即可。对于像这样的代码示例:而True: 通过要么而True: time.sleep(1)哪一个对系统的影响最小?除了保持python应用运行外,什么都不做的首选方式是什么? 参考方案 我可以想象time.sleep()会减少系…如何使用BeautifulSoup在

中捕获特定的 - python

尝试从nyc Wiki页面中的高中列表中获取所有高中名称。我已经写了足够多的脚本,可以让我获取包含在高中,学业和入学条件列表的表的

标记中的所有信息-但是我如何才能缩小到我认为的范围内在td[0]内休息(会弹出KeyError)-只是学校的名称?到目前为止我写的代码:from bs4 import BeautifulSoup from ur…Python NotImplemented常数 - python

浏览decimal.py,它在许多特殊方法中使用NotImplemented。例如class A(object): def __lt__(self, a): return NotImplemented def __add__(self, a): return NotImplemented Python docs say: 未实现 可以通过“丰富比较”返回的特…

python代码评测结果tle_TLE计算列表中指定范围内的元素数 - python相关推荐

  1. python中偶数怎么表示_Python程序可计算列表中的偶数和奇数

    在本文中,我们将学习下面给出的问题陈述的解决方案. 问题陈述-我们得到一个列表,我们需要计算列表中的偶数和奇数. 共有三种方法,如下 - 方法1:使用蛮力方法 示例list1 = [21,3,4,6, ...

  2. python返回索引值_python 返回列表中某个值的索引方法

    python 返回列表中某个值的索引方法 如下所示: list = [5,6,7,9,1,4,3,2,10] list.index(9) out:3 同时可以返回列表中最大值的索引list.index ...

  3. Python代码 | 文本操作 统计英文文本中,每个字母出现的次数

    Python代码 | 文本操作 统计英文文本中,每个字母出现的次数 # -*- coding: utf-8 -*- # 使用oepn获取文件路径 # path=open("arrogant. ...

  4. python中列表用某个数字出现的次数_Python实现统计给定列表中指定数字出现次数的方法...

    本文实例讲述了Python实现统计给定列表中指定数字出现次数的方法.分享给大家供大家参考,具体如下: 直接看实现: #!usr/bin/env python #encoding:utf-8 ''''' ...

  5. Python | 程序从列表中删除范围内的所有元素

    Given a list and we have to remove elements in a range from the list in Python. 给定一个列表,我们必须从Python中的 ...

  6. python两两组合_python – 一个列表中的两个组合列表

    我是一个Python初学者.我想从一个列表中获取两个组合列表. 例如,我有一个列表: c = [1, 2, 3, 4] 我想使用每四个项目来获得每个可能的组合来填充两个列表.将会有((2 ^ 4)/ ...

  7. Python列表(获取列表中指定元素的索引、获取列表中的多个元素、判断指定元素是否在列表中存在、列表元素的遍历、列表元素的增加操作、 列表元素的删除操作、列表元素的修改操作、列表元素的排序操作)

    1.获取列表中指定元素的索引 eg1:未指定索引范围查找索引 zyr=['憨憨','憨宝'] print(zyr.index('憨宝')) print(zyr[1]) eg2:在指定索引范围内查找元素 ...

  8. java list 截取部分数据_Java List.subList()方法:获取列表中指定范围的子列表

    集合类中的 List.subList() 方法用于获取列表中指定范围的子列表,该列表支持原列表所支持的所有可选操作.返回列表中指定范围的子列表. 语法: subList(int fromIndex,i ...

  9. list -- set方法——替换列表中指定位置的元素

    set方法用于替换列表中指定位置的元素. 返回值:索引位置替换前的元素. 参数:index用于指定要替换元素所在位置的索引. 参数:element用于指定要存储在指定位置的元素. 示例  本示例使用L ...

最新文章

  1. 【OpenGL】九、OpenGL 绘制基础 ( OpenGL 状态机概念 | OpenGL 矩阵概念 )
  2. XAML或JavaFx?
  3. 信号与系统 chapter10 系统的初值问题与系数匹配法
  4. usb接口供电不足_1个USB接口变成4个?什么东西那么“牛”?请你花2分钟了解一下...
  5. 电脑键盘练习_用键盘打字怎样才能练得快,有什么窍门没?
  6. linux VPS上装FTP
  7. 《人月神话》读后总结
  8. 荣耀正式出售!30余家代理商接盘自救,华为回应...
  9. 95-872-055-源码-CEP-Pattern API
  10. fisco bcos transaction交易结构 源代码位置
  11. html中调用javascript函数,如何在HTML中调用JavaScript函数
  12. 红巨星粒子插件:Red Giant Trapcode Suite 15 for Mac
  13. 七个习惯之三:要事第一
  14. PS:PS将彩色相片变成纯黑白色
  15. eNSP交换机配置IP
  16. DNS配置错误如何修复
  17. linux什么时候挂载根文件系统,什么时候要重新制作Linux的根文件系统?谢谢
  18. linux 多核cpu监控,Linux 下多核CPU知识
  19. fMRI之dpabi处理经验(一)
  20. APP android 测试用例手册

热门文章

  1. win32 htmlayout dom操作demo
  2. 循序渐进DB2 (第2版)——DBA系统管理、运维与应用案例
  3. js 操作Listbox js 获取Listbox选择的值的代码
  4. 解析Json的格式.
  5. [jQuery基础] jQuery对象 -- 属性操作
  6. Cycle-2(循环)
  7. 7-135 二叉搜索树的2层结点统计
  8. 7-150 水仙花数 (20 分)
  9. 3001基于哈夫曼树的数据压缩算法(附思路及注释)
  10. Iphone如何应对华为鸿蒙系统,鸿蒙2.0向iOS看齐 系统解决了 芯片怎么办?