我想检查数组中是否有75%的对象填充,如果是,我必须调整它的大小。在变量size
中,我有我的对象(!= null),我有一个整数数组ints
public class PQ {
private int[] pq;
private int size;
public PQ(int capacity) {
if (capacity < 1) {
throw new IllegalArgumentException();
}
this.pq = new int[capacity + 1];
this.size = 0;
}
public void insert(int number) {
//Code
}
private int[] resize() {
int[] newPQ = new int[this.pq.length * 2];
for (int i = 0; i < this.pq.length; i++) {
newPQ[i] = this.pq[i];
}
return newPQ;
}
}
答案 0 :(得分:2)
试试这个:
无论何时添加元素,我们都会增加size
(这将跟踪非空格的数量,这样您就不需要不断地重新计算数组)。然后我们将这个数字与数组的总长度进行比较。如果count至少是数组大小的75%,我们调用你的resize方法并将pq设置为它返回的新数组。我假设您希望添加到数组的末尾,并且您不希望数字之间有空索引。如果你想要间隙,你需要使用一个循环,我试图避免为了效率,如果没有必要。假设你没有,你可以在索引size
添加到你的数组,因为这将是第一个非空元素。
//O(1) efficiency if you don't need to resize, O(n) if you do
public void insert(int number) {
if(size / pq.length >= 75) {
pq = resize();
}
pq[size] = number; //Since this will be the first non-empty index
size++;
return; //Doing it this way, if you can, is much more efficient than looping
}
如果你打电话删除并从最后取出,你将不得不将所有东西都移开,这样你就没有空的空间了。
如果你要使用空索引,请尝试这样的事情(在循环遇到的第一个空索引处插入)...让我们使用一个Integer [],这样你就可以检查null而不是不得不担心数组中的任何0被计为空(int []将所有内容都计为0)。
这样我们可以检查空白区域,如果您在int[]
中使用任何空格,则0不会被计为空格。
//O(n) efficiency if you don't need to resize, O(n^2) if you do
public void insert(int number) {
if(size / pq.length >= 75) {
pq = resize();
//You would have to make resize return an Integer[] and
//implement this throughout the code
}
for(int i = 0; i < pq.length; i++) {
if(pq[i] == null) {
pq[size] = number;
size++;
return;
}
}
}
<强>无论:强>
请记住,当您致电remove()
以递减size
时。
答案 1 :(得分:1)
你可以做的是有一个名为count的整数实例变量,它跟踪pq数组中元素的数量。每当通过insert方法将元素插入到数组中时,都可以增加count变量。每当通过remove方法从数组中删除元素时,都可以减少count变量。然后,您可以使用它来检查阵列是否至少填充75%,
from random import choice
from numpy import random
from matplotlib import pyplot as plt
import seaborn as sns
import pandas as pd
def my_kdeplot(dfx, dfy, *args, **kwargs):
ax = sns.kdeplot(dfx, dfy, alpha=0.7,
cmap=sns.light_palette(kwargs['color'], as_cmap=True))
names = [choice('ABCDE') for _ in range(1000)]
df = pd.DataFrame(list(zip(names, *[random.random(1000) for _ in range(5)])),
columns=['names','A','B','C','D','E'])
g = sns.PairGrid(df, hue='names')
g.map_lower(my_kdeplot)
g.map_upper(plt.scatter, alpha=0.7)
g.map_diag(plt.hist)
g = g.add_legend(fontsize=14)
sns.plt.savefig('fig.png')
课程看起来像这样,
if(pq.length * .75 <= size){
//do what you need to do here
}
答案 2 :(得分:0)
您明确将大小存储为变量。您还知道支持数组的大小。在需要检查大小时比较它们:if(this.size > 3*this.pq/4)
。
答案 3 :(得分:-1)
使用ArrayList
以更有效的方式为您自动完成所有操作。
<强>编辑:强>
是初始化,全部放-1 -
this.pq = new int[capacity + 1];
Arrays.fill(pq, -1);
然后当你检查时你会这样:
if(pq[pq.length*.75] != -1) {
// then is means that is has already filled up 75%
} else {
// not filled 75% yet
}