我有一个选择.
我有许多已经排序的字符串,我需要存储和访问.看起来我可以选择使用:
字符串的链接列表(单链接)
艾伦在他的评论中建议我也加入选择:
TList<string>在什么情况下,这些都比其他更好?
哪个最适合小清单(10项以下)?
哪个最适合大型列表(超过1000个项目)?
哪个最适合大型列表(超过1,000,000个项目)?
哪个最好最小化内存使用?
哪个最好最小化加载时间以在最后添加额外的项目?
哪个最好最小化从头到尾访问整个列表的访问时间?
在此基础上(或任何其他),哪种数据结构更可取?
作为参考,我使用的是Delphi 2009.
Dimitry在评论中说:
描述您的任务和数据访问模式,然后就可以给您一个确切的答案
好的.我有一个包含大量数据的家谱程序.
对于每个人,我有许多事件和属性.我将它们存储为短文本字符串,但每个人都有很多,范围从0到几百.我有成千上万的人.我不需要随机访问它们.我只需要将它们作为连接到每个人的已知顺序的多个字符串相关联.这是我的数千个"小名单"的案例.它们需要时间来加载和使用内存,如果我需要它们,则需要时间来访问(例如,导出整个生成的报告).
然后我有一些较大的列表,例如我的"虚拟"树视图的所有部分的名称,它们可以有数十万个名称.我再次只需要一个可以通过索引访问的列表.它们与树视图分开存储以提高效率,树视图仅在需要时检索它们.这需要一段时间来加载,并且对于我的程序来说,内存非常昂贵.但我不必担心访问时间,因为一次只能访问少数访问时间.
希望这能让您了解我正在努力实现的目标.
ps我在StackOverflow上发布了很多关于优化Delphi的问题.我的程序读取包含100,000人的25 MB文件,并在8秒内为它们创建数据结构和报告以及树视图,但使用175 MB的RAM来执行此操作.我正在努力减少这一点,因为我的目标是在32位Windows中加载数百万人的文件.
我刚刚在StackOverflow问题上找到了一些优化TList的优秀建议: 是否有更快的TList实现?
delphi linked-list tstringlist dynamic-arrays data-structures
我目前正在阅读我的教科书,我很困惑为什么动态数组需要O(n)时间来删除最后的项目.我知道从任何其他索引中删除一个项目是O(n),因为你必须复制所有数据并移动它们以填补空白,但如果它最后不是我们只是减少计数并设置索引喜欢0还是null?我在书中加了一张照片.这很奇怪,因为它说索引是O(1)所以我们必须知道项目的位置,所以我们不必像链表一样遍历数组.
如果我有一个类需要返回一个变量维的字符串数组(并且该维度只能在运行该类的某个方法时确定),那么如何在类的构造函数中声明动态数组?
如果问题不够明确,
在php中,我们可以简单地声明一个字符串数组,$my_string_array = array();
并通过它添加元素$my_string_array[] = "New value";
上面的代码是什么,然后在java中?
这让我困扰了一段时间.它是我(缺乏)理解静态和动态内存分配之间差异的核心.以下数组是一个普通的静态数组,它应该意味着内存是在编译期间分配的,对吗?然而,我已经设置好了,以便用户在运行时输入数组大小.
#include <iostream>
using namespace std;
int main() {
cout << "how many elements should the array hold? ";
int arraySize;
cin >> arraySize;
int arr[arraySize];
for (int i = 0; i < arraySize; ++i)
arr[i] = i * 2;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请注意,此程序中没有new或delete运算符.它在Xcode 4.2(默认的Clang编译器)以及我学校的UNIX服务器(GCC 4.4.5)中工作正常.arr在编译时创建数组时,编译器如何知道要分配多少内存?这只是我的编译器的侥幸,危险的代码,可能会破坏其他内存,或者这是合法的吗?
我有一个动态分配的整数数组,我想在任意位置插入整数.超过250万的许多整数.
我的代码目前看起来像这样:
type
TIntegerArr = array of Integer;
var
FCount: Integer;
FSortedList: TIntegerArr;
procedure Insert(_Value: Integer; _InsertPos: integer);
var
OldList: TIntegerArr;
begin
OldList := FSortedList;
if Length(FSortedList) < FCount + 1 then begin
OldList := FSortedList;
FSortedList := nil;
SetLength(FSortedList, FCount + 100);
CopyMemory(@FSortedList[0], @OldList[0], SizeOf(Integer) * _InsertPos);
end;
MoveMemory(@FSortedList[_InsertPos + 1], @OldList[_InsertPos], SizeOf(Integer) * (FCount - _InsertPos));
FSortedList[_InsertPos] := _Value;
Inc(FCount);
end;
Run Code Online (Sandbox Code Playgroud)
(真正的代码是一个将FSortedList和FCount作为字段的类的方法.)
使用临时列表并使用Move而不是for循环来移动数据可以提高性能,因为它可以防止数组在必须增长时被复制两次(一次在现有阵列上的SetLength中,另一次在Move中) ).
但最坏的情况是Insert(SomeValue,0)仍然会移动所有现有值.
到目前为止,我一直在考虑在数组的开头引入一个偏移量,而不是每次在前面插入一个新值时都必须移动所有现有的值,我只能在偏移量达到0时才这样做. :
// simple case: inserting at Position 0:
if FOffset = 0 …Run Code Online (Sandbox Code Playgroud) 我想在Go中创建一个2d数组:
board := make([][]string, m)
for i := range board {
board[i] = make([]string, n)
}
Run Code Online (Sandbox Code Playgroud)
但是,鉴于其详细程度,我想知道是否有更好或更简洁的方法来处理这个问题(要么生成动态数组,要么使用不同/惯用的数据结构来处理这样的棋盘游戏数据)?
背景:
我们已经知道,VLA(在C99中标准化)不是C++标准的一部分.
所以下面的代码在C++中是"非法的":
void foo(int n) {
int vla[n];
for (int i = 0; i < n; ++i) {
vla[i] = i;
}
}
Run Code Online (Sandbox Code Playgroud)
尽管编译器(g ++和clang ++)接受代码作为有效语法,但只有在启用情况下才会生成警告 .-pedantic
ISO C++禁止变长数组'vla'[-Wvla]
我的问题是:
为什么编译器接受该声明?
编译器不能只拒绝一个长度为的数组[is-no-know-at-compile-time]?
是否存在一种兼容性语法规则?
标准说了什么?
从生成的汇编代码中我看到编译器在循环中写入堆栈,就像普通数组一样,但我找不到任何关于标准行为的信息.
我正在学习函数/指针,并且遇到了一些问题.我需要写的是一个C程序main()和另外两个函数.
read_funct()必须分配足够的内存malloc()用于存储数据.
函数原型read_funct 必须是:
int read_funct(int *data_num, double **data_vals, char *filename)
Run Code Online (Sandbox Code Playgroud)main() 调用第一个函数: read_funct()
read_num()从文件中读取二进制数据.必须提取两个值:no.值(前4个字节),然后是值本身(每个8个字节,因此包含在下一个8*值的值中).这些对应于data_num和data_vals.他们必须打印,程序然后返回main().
main() 执行操作以编辑第一个文件中的数据.
main()调用第二个函数:write_funct(),它将编辑后的数据写入新文件.
第一个函数data_num正确读取,并读取/打印data_vals.这一切都正常.但是,我正在尝试打印这些main()以验证我正在对正确的数据执行操作,但我无法使其正常工作.
注意:我现在不是试图让它一起工作write_funct(),只是一步一步地进行.
这是我目前的代码main():
int read_funct(int *data_num, double **data_vals, char *filename);
int main()
{
int data_num;
double **data_vals;
//Reads file using read_funct()
read_funct(&data_num, data_vals, filename);
//Check: print data_num
printf("\nCheck No. of Values: %d\n", …Run Code Online (Sandbox Code Playgroud) 我试图在构造函数中初始化一个大小的列表.但是我的列表大小为0.
val seqList = ArrayList<ArrayList<Int>>(N) // This has the Problem
val queries = ArrayList<Query>(Q) // This works like a charm
Run Code Online (Sandbox Code Playgroud)
我有两个N并Q设置为来自用户的非零输入让我们说
N = 100和Q = 100
调试我的代码时,我发现了,queries.size() = 100但是seqList.size() = 0
我的假设是不正确的,也seqList应该用N ArrayList<Int>对象初始化.
我创建了一个动态数组,我需要将所有成员初始化为0.如何在C中完成?
int* array;
array = (int*) malloc(n*sizeof(int));
Run Code Online (Sandbox Code Playgroud) dynamic-arrays ×10
arrays ×5
java ×3
c ×2
c++ ×2
delphi ×2
delphi-2007 ×1
go ×1
kotlin ×1
linked-list ×1
list ×1
pointers ×1
tstringlist ×1