在c ++中定义全局或静态数组时,它的内存不会立即保留在程序的开头,而只会在我们写入数组时保留.我发现令人惊讶的是,如果我们只写入数组的一小部分,它仍然不会保留整个内存.考虑以下小例子,它稀疏地写入全局数组:
#include <cstdio>
#include <cstdlib>
#define MAX_SIZE 250000000
double global[MAX_SIZE];
int main(int argc, char** argv) {
if(argc<2) {
printf("usage: %s <step size>\n", argv[0]);
exit(EXIT_FAILURE);
}
size_t step_size=atoi(argv[1]);
for(size_t i=0; i<MAX_SIZE; i+=step_size) {
global[i]=(double) i;
}
printf("finished\n"); getchar();
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
现在为不同的步长执行此操作并查看top的输出,我们得到例如:
./a.out 1000000
./a.out 100000
./a.out 10000
./a.out 1000
./a.out 100
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
15718 user 20 0 1918m 1868 728 S 0 0.0 0:00.00 a.out
15748 user 20 0 …Run Code Online (Sandbox Code Playgroud) 这是一个重复的问题,这除了对R,而不是Python的.
我想在列表中标识连续的组(有些人称它们是连续的)整数,其中重复的条目被视为在同一范围内存在.因此:
myfunc(c(2, 3, 4, 4, 5, 12, 13, 14, 15, 16, 17, 17, 20))
Run Code Online (Sandbox Code Playgroud)
收益:
min max
2 5
12 17
20 20
Run Code Online (Sandbox Code Playgroud)
虽然任何输出格式都可以.我目前的蛮力,for-loop方法非常慢.
(如果我能轻易地重新解释Python的答案并且我是愚蠢的,那道歉!)
我想知道是否可以在 O(n) 或更短的时间内完成这个挑战。描述如下:
青蛙跳
2 只青蛙可以从给定的 input_array 中的任何索引开始。该函数应该返回这些青蛙可以在它们之间创建的最大可能距离(两者的索引值之间的差异),让它们彼此跳得更远。
青蛙只能跳到更高值的元素或一些相同高度的元素上,它们不能跳过任何元素。
输入:[1, 5, 5, 2, 6]
输出:3。最大距离 3 是通过生成位置 3(0 索引)和左青蛙跳到索引 1 和右青蛙跳到索引 4 来创建的。
len(input_array) 介于 2 和 200 000 之间。数组中的值是介于 1 和 1 000 000 000 之间的整数。
实际上,这里的挑战似乎是找到最长的连续子序列,使其首先不增加,然后不减少(行为的变化点是开始索引)。这似乎是最高和子阵列任务的变体。
我最好的解决方案是 O(n log n) 通过迭代数组中的所有索引并携带一个max_value来检查两只青蛙可以从该迭代的索引跳多远。
这可以在 O(n) 或更少的时间复杂度内完成吗?
[解决] 谢谢大家的回复。这是一次性解决方案的 Python 实现:
def one_pass_solution(array: List[int]) -> int:
current_peak_index = 0
previous_peak_index = 0
repeat_peaks = 0
max_distance = 0
is_going_up = False
for i in range(len(array) - 1):
this_height, next_height …Run Code Online (Sandbox Code Playgroud) 我正在阅读《现代 Fortran 解释》(2018 年版)。p24上说:
大多数实现实际上按数组元素顺序将数组存储在连续存储中,但我们强调标准并不要求这样做。
我相信这已经可以追溯到旧的 Fortran 77(及更早版本)。给予声明
real, dimension(5,5) :: a
Run Code Online (Sandbox Code Playgroud)
我的理解是,标准不要求这个数组是连续的。这与本书第 2 节中所说的一致。第 140 页上的 7.18.1:
...Fortran 标准回避指定数组在占用连续内存位置且没有中间未占用空间的意义上是否是连续的。
但书接着继续(仍然是第 140 页):
标准认为以下任何数组都是连续的:
具有连续属性的数组; 不是指针或假定形状的整个数组(命名数组或数组组件,无需进一步限定); ...
我理解第一个标准;但我对第二个标准感到困惑。这是否与前面的说法不一致,即 fortran 标准不要求将数组按数组元素顺序存储在连续存储中?现代 Fortran 是否已经摆脱了这种范式?或者由于超出我对这个主题的理解的原因,上述引用并不相互矛盾?在上面的例子中,数组a是否需要连续?
我正在尝试编写一个算法,它将返回True/False一个排序数组中只包含正整数的连续序列,可以求和N.
例如:
Array = { 1, 2, 3, 4 };
6 is good! 1 + 2 + 3 = 6
8 is not good! 1 + 3 + 4 = 8, but it's not contiguous, since we skipped the 2.
Run Code Online (Sandbox Code Playgroud)
这是我试图做的:
int[] arr = ...;
int headIndex = 1, tailIndex = 0, sum = arr[0];
while (sum != n)
{
if (sum < n)
{
sum += arr[headIndex++];
}
if (sum > n)
{ …Run Code Online (Sandbox Code Playgroud) 给出一个清单:
>>> l = ['x', 'x', 'y', 'y', 'x']
Run Code Online (Sandbox Code Playgroud)
我可以使用以下方法获取列表的计数collections.Counter:
>>> from collections import Counter
>>> Counter(l)
Counter({'x': 3, 'y': 2})
Run Code Online (Sandbox Code Playgroud)
如何计算连续项而不是列表中元素的全局计数?例如
>>> l = ['x', 'x', 'y', 'y', 'x']
>>> ContiguousCounter(l)
[('x',2), ('y',2), ('x', 1)]
>>> l = ['x', 'x', 'y', 'y', 'x', 'x', 'x', 'y']
>>> ContiguousCounter(l)
[('x',2), ('y',2), ('x', 3), ('y', 1)]
Run Code Online (Sandbox Code Playgroud) 最近,我在处理具有该contiguous属性的虚拟数组的子程序时遇到了 Fujitsu Fortran 2.0.0 版的意外行为。
我已将问题简化为一个简单的示例,如下所示:
program test
INTEGER, DIMENSION(:,:), ALLOCATABLE :: t
INTEGER :: i, j
ALLOCATE(t(3,3))
DO i = 1, 4
DO j = 1, 4
t(i,j) = i*j
!!PRINT *, t(i,j)
END DO
END DO
CALL fun(t(2,1:4:2))
DEALLOCATE(t)
CONTAINS
SUBROUTINE fun(arg)
! Contiguous dummy argument arg
INTEGER, CONTIGUOUS :: arg(:)
PRINT *, arg(2)
END SUBROUTINE
end program test
Run Code Online (Sandbox Code Playgroud)
这段代码可以通过 gfortran(GNU Fortran (GCC) 6.3.0)成功编译,但在使用 Fujitsu Fortran 编译器(如上所述)的集群上失败,给出以下错误代码:
"test_contiguous.f90", line 13: The actual argument number 1 of …Run Code Online (Sandbox Code Playgroud) 可能重复:
std :: vector元素是否保证是连续的?
我遇到过一种技术,人们在C++中使用向量来接收或发送MPI操作的数据,因为它据说将元素连续存储在内存中.
但是,我仍然怀疑这种方法对于任何大小的向量是否都会保持稳健,特别是当向量增长到一定大小时,这种假设可能会崩溃.
以下是我所说的一个例子:
MPI_Recv( &partials[0] , partials.size() , mpi_partial , 0,
DALG_ELIMINATE_REQ_MSG ,MPI_COMM_WORLD , &status );
Run Code Online (Sandbox Code Playgroud) 我定义了一个 Fortran 连续数组:
import numpy as np
hp = np.zeros([number_fragments, max(length_fragments_list), 6], order='F')
Run Code Online (Sandbox Code Playgroud)
该数组的切片在 Fortran 中不是连续的。我该如何解决这个问题?
hn = hp[0,0:Length-1,:]
hn.flags
C_CONTIGUOUS : False
F_CONTIGUOUS : False
also
hn = hp[0,0:Length-1,:].copy()
hn.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : False
Run Code Online (Sandbox Code Playgroud)
如何在切片后轻松获得 Fortran 连续数组?
交换两个元素后,向量是否会保持连续状态?
PS:无论答案是什么,我们怎么能确定?如果那是可能的.
我对C很新,并且无法弄清楚如何将连续内存分配给结构数组.在这个赋值中,我们给出了代码的shell,并且必须填写其余部分.因此,我无法更改变量名称或函数原型.这是给我的:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct student {
int id;
int score;
};
struct student *allocate() {
/* Allocate memory for ten students */
/* return the pointer */
}
int main() {
struct student *stud = allocate();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我只是不确定如何去做那些评论在分配功能中所说的内容.
如何删除DataFrame中的连续/连续/相邻重复项?
我正在处理CSV格式的数据,按日期排序,然后按标识号排序。标识号可以在不同的日期出现,但是我只想删除每日重复的记录。drop_duplicates会留下一个唯一的实例,但随后所有其他日子都将其删除。我已经尝试过了,但是得到了错误:
localhost:~/Desktop/Public$ python3 test.py
Traceback (most recent call last):
File "test.py", line 31, in <module>
df2.loc[df2.shift(1) != df2]
File "/usr/lib/python3/dist-packages/pandas/core/indexing.py", line 1028, in __getitem__
return self._getitem_axis(key, axis=0)
File "/usr/lib/python3/dist-packages/pandas/core/indexing.py", line 1148, in _getitem_axis
raise ValueError('Cannot index with multidimensional key')
ValueError: Cannot index with multidimensional key
Run Code Online (Sandbox Code Playgroud)
我尝试index_reset()删除任何多索引。这是数据集的示例:
,DATE,REC,NAME
0,07/02/2009,682566,"Schmoe, Joe"
1,07/02/2009,244828,"Doe, Joe"
2,07/11/2009,325640,"Black, Joe"
3,07/11/2009,544440,"Dirt, Joe"
4,07/11/2009,544440,"Dirt, Joe"
5,07/16/2009,200560,"White, Joe"
6,07/16/2009,685370,"Purple, Joe"
7,07/16/2009,685370,"Purple, Joe"
8,07/16/2009,635400,"Red, Joe"
9,07/16/2009,348562,"Blue, Joe
Run Code Online (Sandbox Code Playgroud) 我写了这个小函数:
int mayor(int n1, int n2, int n3, int n4, int n5) {
int mayor = n1;
for(int *p=&n2; p<=&n5; ++p)
mayor = *p;
return mayor;
}
Run Code Online (Sandbox Code Playgroud)
能够保证所有包含该内存块n1到n5是连续的?既然我得到了预期的回报值,我希望如此,但我想知道这是否安全.
c parameter-passing calling-convention memory-layout contiguous