集合有 contains 函数,如果集合中存在成员,则返回 true;否则为假。
其复杂度为O(1)。
我想知道它的复杂度如何是恒定的 O(1) 即它不依赖于大小
以下是文档:https://developer.apple.com/documentation/swift/set/1540013-contains
我正在做一个家庭工作问题,不使用框架方法拆分字符串.
以下是我提出的工作代码.
我想知道如何改善O(n)的运行时间?
此外,欢迎任何改进建议.
public static string[] split(string txt, char[] delim)
{
char[] text = txt.ToCharArray();
string[] result = new string[0];
int count = 0;
int i = 0;
StringBuilder buff = new StringBuilder();
while(i < text.Length)
{
bool found = false;
foreach(char del in delim)
{
if(del == txt[i])
{
found = true;
break;
}
}
if(found)
{
count++;
Array.Resize(ref result, count);
result[count - 1] = buff.ToString();
buff = new StringBuilder();
}
else
{
buff.Append(txt[i]);
}
i++;
}
if(buff.Length …Run Code Online (Sandbox Code Playgroud) 我完全熟悉哈希表和哈希的工作原理,但我试图完全理解O(1)是如何完全来自的。
set1 = {'s','t'}
print('x' in set1)
print('s' in set1)
set2 = {'s'}
print('s' in set2)
Run Code Online (Sandbox Code Playgroud)
我被告知要检查是否's'在 set1 中,if 将检查 的哈希值的内存分配's',并检查它是否在O(1)中的 set1 中并返回布尔值。因此两个 O(1) 操作,但我的问题是:散列实际上如何深入工作。我的意思是,当您 hash 时's',该散列是否有类似的东西set1,set2并且您正在检查是否set1为set1或set2,或者每个集合是否具有不同的散列's'并且您正在检查's'每个不同集合的散列。
假设我想存储一个字符串字典,我想知道某个字符串是否存在。我可以使用Trie或 HashMap。HashMap 的时间复杂度为 O(1),概率很高,而在这种情况下,Trie 的时间复杂度为 O(k),其中 k 是字符串的长度。
现在我的问题是:计算字符串的哈希值是否具有 O(k) 的时间复杂度,从而使 HashMap 的复杂度相同?如果不是,为什么?
我的看法是,这里的 Trie 比查找字符串的 HashMap 具有更低的时间复杂度,因为 HashMap - 除了计算哈希值 - 可能会发生冲突。我错过了什么吗?
更新:在构建字典时,您会使用哪种数据结构来优化速度?
HashMap(或)HashTable 是键控数组的一个示例。这里,索引是用户定义的键而不是通常的索引号。例如,arr["first"]=99是一个哈希映射的示例,其中 b 键为第一个,值为 99。
由于使用了键,因此需要哈希函数将键转换为索引元素,然后在数组中插入/搜索数据。此过程假设不存在冲突。
现在,给定一个要在数组中搜索的键,如果存在,则必须获取数据。因此,每次搜索之前,都必须将键转换为数组的索引号。那么如何花费 O(1) 时间呢?因为,时间复杂度也取决于哈希函数。所以时间复杂度一定是O(哈希函数的时间)。
std::unordered_map 保证O(1)时间搜索,但它如何管理碰撞?
无序映射是一个关联容器,包含具有唯一键的键值对.元素的搜索,插入和删除具有平均的恒定时间复杂度.
假设所有哈希码都相同的情况,内部如何处理冲突?
如果哈希码对每个键都是唯一的,那么我的假设将完全错误.在这种情况下,如何在没有冲突的情况下创建唯一的哈希码?
std::unordered_map哈希函数采用什么方法来保证O(1)搜索?
对于HashMap<String, String> map每次键-值对被插入到散列计算地图-
java.lang.String#hashCode
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
Run Code Online (Sandbox Code Playgroud)
由于不言自明,put 操作的复杂性基本上就是哈希计算的复杂性。
那么,为 put/get 操作定义 hashmap 最坏情况时间复杂度的适当方法应该是什么?
如果您从哈希冲突的角度有同样的问题,在这里您可以找到答案: Java 哈希映射真的是 O(1) 吗?
我管理的Google表格列表有时超过10,000行。对于行数最多为5,000的工作表,下面提到的删除重复项功能可以正常工作。但是对于超过5,000的任何内容,我都会收到“超出最大执行时间”错误。我希望能获得一些有关如何提高代码效率的说明,即使对于具有10k +行的工作表也可以平稳运行。
function removeDuplicates() {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var newData = new Array();
for(i in data){
var row = data[i];
var duplicate = false;
for(j in newData){
if(row.join() == newData[j].join()){
duplicate = true;
}
}
if(!duplicate){
newData.push(row);
}
}
sheet.clearContents();
sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}
Run Code Online (Sandbox Code Playgroud) 如果散列表包含N个不同的项,并且没有重载,则N个项的散列必须具有大约lg(N)位,否则太多项将获得相同的散列值.
但是哈希表查找通常被认为平均花费O(1)时间.
在O(1)时间内不可能生成lg(N)位,因此散列表复杂性的标准结果是错误的.
我的推理有什么问题?