import
java.util.Scanner;
import
java.util.TreeMap;
import
java.util.Map;
public
class
SparseVector {
private
TreeMap<Integer, Double> st;
private
int
size;
public
SparseVector(
int
size)
{
this
.size = size;
st =
new
TreeMap<Integer, Double>();
}
public
void
put(
int
i,
double
value)
{
if
(i <
0
|| i >= size)
throw
new
RuntimeException(
"\nError : Out of Bounds\n"
);
if
(value ==
0.0
)
st.remove(i);
else
st.put(i, value);
}
public
double
get(
int
i)
{
if
(i <
0
|| i >= size)
throw
new
RuntimeException(
"\nError : Out of Bounds\n"
);
if
(st.containsKey(i))
return
st.get(i);
else
return
0.0
;
}
public
int
size() {
return
size; }
public
double
dot(SparseVector b)
{
SparseVector a =
this
;
if
(a.size != b.size)
throw
new
RuntimeException(
"Error : Vector lengths are not same"
);
double
sum =
0.0
;
if
(a.st.size() <= b.st.size()) {
for
(Map.Entry<Integer, Double> entry :
a.st.entrySet())
if
(b.st.containsKey(entry.getKey()))
sum += a.get(entry.getKey())
* b.get(entry.getKey());
}
else
{
for
(Map.Entry<Integer, Double> entry :
b.st.entrySet())
if
(a.st.containsKey(entry.getKey()))
sum += a.get(entry.getKey())
* b.get(entry.getKey());
}
return
sum;
}
public
SparseVector plus(SparseVector b)
{
SparseVector a =
this
;
if
(a.size != b.size)
throw
new
RuntimeException(
"Error : Vector lengths are not same"
);
SparseVector c =
new
SparseVector(size);
for
(Map.Entry<Integer, Double> entry :
a.st.entrySet())
c.put(entry.getKey(), a.get(entry.getKey()));
for
(Map.Entry<Integer, Double> entry :
b.st.entrySet())
c.put(entry.getKey(),
b.get(entry.getKey())
+ c.get(entry.getKey()));
return
c;
}
public
String toString()
{
String s =
""
;
for
(Map.Entry<Integer, Double> entry :
st.entrySet())
s +=
"("
+ entry.getKey() +
", "
+ st.get(entry.getKey()) +
") "
;
return
s;
}
public
static
void
main(String[] args)
{
Scanner scan =
new
Scanner(System.in);
System.out.println(
"Enter size of Sparse Vectors : "
);
int
n = scan.nextInt();
SparseVector A =
new
SparseVector(n);
SparseVector B =
new
SparseVector(n);
System.out.println(
"Enter number of entries for Vector A :"
);
int
n1 = scan.nextInt();
System.out.println(
"Enter "
+ n1
+
" (int, double) pairs :"
);
for
(
int
i =
0
; i < n1; i++)
A.put(scan.nextInt(), scan.nextDouble());
System.out.println(
"Enter number of entries for vector B :"
);
int
n2 = scan.nextInt();
System.out.println(
"Enter "
+ n2
+
" (int, double) pairs :"
);
for
(
int
i =
0
; i < n2; i++)
B.put(scan.nextInt(), scan.nextDouble());
System.out.println(
"\nVector A = "
+ A);
System.out.println(
"Vector B = "
+ B);
System.out.println(
"\nA dot B = "
+ A.dot(B));
System.out.println(
"A + B = "
+ A.plus(B));
}
}