ensureCapacity

本文介绍了一种内存容量确保的方法,通过动态分配长整型数组来实现。具体包括确定最大长度、分配内存、初始化指针数组等步骤,并设置了一些关键参数如采样大小等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void ensureCapacity(long maximumSize) {
    int i;
    int maximum = (int) min(maximumSize, (unsigned int)MAX_VALUE >> 1);

    int length=(maximum == 0) ? 1 : maximum;
    table = (long **)zmalloc(8*length);
   
    for(i=0;i<length;i++)
        table[i]=0;

    tableMask = max(0, length - 1);
    sampleSize = (maximumSize == 0) ? 10 : (10 * maximum);
 
    if (sampleSize <= 0) {
      sampleSize = MAX_VALUE;
    }
    size = 0;
  }

``` package oy.tol.tra; import java.util.List; import java.util.Objects; /** * A generic and slow Key-Value linear array. */ public class KeyValueArray<K extends Comparable<K>, V> implements Dictionary<K,V> { private Pair<K, V> [] pairs = null; private int count = 0; private int reallocationCount = 0; public KeyValueArray(int capacity) { ensureCapacity(capacity); } public KeyValueArray() { ensureCapacity(20); } @Override public Type getType() { return Type.SLOW; } @SuppressWarnings("unchecked") @Override public void ensureCapacity(int size) throws OutOfMemoryError { if (size < 20) { size = 20; } pairs = (Pair<K,V>[])new Pair[size]; reallocationCount = 0; } @Override public int size() { return count; } @Override public String getStatus() { String toReturn = "KeyValueArray reallocated " + reallocationCount + " times, each time doubles the size\n"; toReturn += String.format("KeyValueArray fill rate is %.2f%%%n", (count / (double)pairs.length) * 100.0); return toReturn; } @Override public boolean add(K key, V value) throws IllegalArgumentException, OutOfMemoryError { if (null == key || value == null) throw new IllegalArgumentException("Person or phone number cannot be null"); for (Pair<K, V> pair : pairs) { // Must not have duplicate keys, so check if key is already in the array. if (pair != null && pair.getKey().equals(key)) { pair.setValue(value); return true; } } if (count >= pairs.length) { reallocate(pairs.length * 2); } if (count < pairs.length) { pairs[count++] = new Pair<>(key, value); return true; } return false; } @Override public V find(K key) throws IllegalArgumentException { if (null == key) throw new IllegalArgumentException("Person to find cannot be null"); for (int counter = 0; counter < count; counter++) { if (pairs[counter] != null && key.equals(pairs[counter].getKey())) { return pairs[counter].getValue(); } } return null; } @Override @java.lang.SuppressWarnings({"unchecked"}) public Pair<K,V> [] toSortedArray() { Pair<K, V> [] sorted = (Pair<K,V>[])new Pair[count]; int newIndex = 0; for (int index = 0; index < count; index++) { if (pairs[index] != null) { sorted[newIndex++] = new Pair<>(pairs[index].getKey(), pairs[index].getValue()); } } Algorithms.fastSort(sorted); return sorted; } @Override public void compress() throws OutOfMemoryError { // Partition nulls to the end of the array int indexOfFirstNull = Algorithms.partition(pairs, count, element -> element == null); // Reallocate to the size of non-null elements reallocate(indexOfFirstNull); } @java.lang.SuppressWarnings("unchecked") private void reallocate(int newSize) throws OutOfMemoryError { reallocationCount++; Pair<K, V> [] newPairs = (Pair<K,V>[])new Pair[newSize]; for (int index = 0; index < count; index++) { newPairs[index] = pairs[index]; } pairs = newPairs; } }```testSlowArray有问题
03-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值